簡體   English   中英

如何轉義“\0 字符”或為什么我的方法不起作用? (C++,GTest)

[英]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 字符串,即以零結尾。 因此,第一個嵌入的零將被視為字符串結尾而不是它的一部分。 事實上,這是唯一的方法,因為大小不通過字符串傳遞(即使是字符串文字,雖然它有一個)。

所以,你需要:

  1. url_to_qname返回您的字符串作為支持嵌入零的內容。 std::string沒問題。
  2. 以類似的方式傳遞字符串文字。 在 C++17 中,您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM