[英]How do I escape the `\0 character` or why is my method not working? (C++, GTest)
我正在編寫 function 來測試從 URL 到查詢名稱格式。 例如,URL“google.com”應該變成“\x6google\x3com\0”。 但是如果我想測試匹配這個我想我只需要做這樣的事情:
// Test first that "google.com" becomes "\6google\3com\0"
EXPECT_EQ(
test_dns_querier->url_to_qname(url_test),
"\x6google\x3""com\\0" // Escaped
);
第一個 \x6 用於匹配 qname 格式的十六進制字符。 與 \x3 相同。 然后在 \x3 之后,我需要停止並開始一個新字符串,因為 'com' 中的 'c' 被誤認為是十六進制字符。 然后我使用'\'來得到一個反斜杠,最后是一個'0',但這是出錯的地方(見下面的ctest output)。
8: Expected equality of these values:
8: test_dns_querier->url_to_qname(url_test)
8: Which is: "\x6google\x3" "com\0"
8: "\x6google\x3""com\\0"
8: Which is: "\x6google\x3" "com\\0"
8: [ FAILED ] dns_query_tests.DemonstrateQNameURLConverision (0 ms)
出於某種原因,我的雙反斜杠不起作用。 當我刪除一個時,它仍然會轉義 '\0' 中的 '0'。
為什么典型的'\'在這種情況下不起作用?
要在字符串文字中嵌入零,請編寫\0
或\x00
。 但在大多數情況下,char arrays(包括字符串文字)被視為 C 字符串,即以零結尾。 因此,第一個嵌入的零將被視為字符串結尾而不是它的一部分。 事實上,這是唯一的方法,因為大小不通過字符串傳遞(即使是字符串文字,雖然它有一個)。
所以,你需要:
url_to_qname
返回您的字符串作為支持嵌入零的內容。 std::string
沒問題。std::string_view
:將您的文字寫為"\x06google\x03com\x00"sv
(在using namespace std::literals
或類似之后),它將以某種方式轉換為std::string_view
保留嵌入的零。 在 C++17 之前需要一些模板或宏魔法,因為std::string("\x06google\x03com\x00")
之類的東西不起作用(該構造函數僅支持 C 字符串)。 更新:正如@273K 指出的那樣,自 C++14 以來,還有一些較早可用的""s
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.