如何转义"\0字符",或者为什么我的方法不起作用?(C++,GTest)



我正在编写一个函数来测试从URL到查询名称格式的转换。例如;google.com";应该变成";\x6google\xcom\0"。但如果我想测试匹配度,我想我只需要做这样的事情:

// Test first that "google.com" becomes "6google3com"
EXPECT_EQ(
test_dns_querier->url_to_qname(url_test),
"x6googlex3""com\0" // Escaped
);

第一个\x6是与qname格式中的十六进制字符匹配。与\x3相同。然后在\x3之后,我需要停止并开始一个新的字符串,因为"com"中的"c"被误认为是十六进制字符。然后我使用"\"来获得一个反斜杠,最后是一个"0",但这里是它出错的地方(请参阅下面的ctest输出(。

8: Expected equality of these values:
8:   test_dns_querier->url_to_qname(url_test)
8:     Which is: "x6googlex3" "com"
8:   "x6googlex3""com\0"
8:     Which is: "x6googlex3" "com\0"
8: [  FAILED  ] dns_query_tests.DemonstrateQNameURLConverision (0 ms)

出于某种原因,我的双反斜杠不起作用。当我删除一个时,它仍然会转义"\0"中的"0"。

为什么典型的"\"在这种情况下不起作用?

若要在字符串文字中嵌入零,请编写x00。但在大多数上下文中,字符数组(包括字符串文字(被视为C字符串,即零终止。因此,第一个嵌入的零将被视为字符串末端,而不是其部分。事实上,这是唯一的方法,因为大小不随字符串传递(即使是字符串文字,尽管它有一个(。

所以,你需要:

  1. url_to_qname返回字符串作为支持嵌入零的东西。std::string正常
  2. 以类似的方式传递字符串文字。在C++17中,您可以使用std::string_view:将文字写为"x06googlex03comx00"sv(在using namespace std::literals之后或类似地(,它将以保留嵌入零的方式转换为std::string_view。在C++17之前,这需要一些模板或宏魔术,因为像std::string("x06googlex03comx00")这样的东西不起作用(该构造函数只支持C字符串(

UPDATE:正如@273K所指出的,还有""s,它在一点之前就可用了,因为C++14。

相关内容

最新更新