2

我正在尝试从字节数组中读取以空字符结尾的字符串;该函数的参数是编码。

string ReadString(Encoding encoding)

例如,以下编码中的“foo”是:

UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00
UTF-8:  66 6f 6f
UTF-7:  66 6f 6f 2b 41 41 41 2d

如果我将所有字节复制到一个数组中(读取到空终止符)并将该数组传递给encoding.GetString(),它将不起作用,因为如果字符串是 UTF-32 编码的,我的算法将在第二个字节后到达“空终止符” .

所以我有一个双重问题:空终止符是编码的一部分吗?如果不是,我如何逐个字符地解码字符串并检查以下字节是否有空终止符?

提前致谢

(建议也值得赞赏)

编辑:

如果 "foo" 以 null 结尾并以 utf-32 编码,那会是什么?:

1. 66 00 00 00 6f 00 00 00 6f 00 00 00   00
2. 66 00 00 00 6f 00 00 00 6f 00 00 00   00 00 00 00
4

3 回答 3

1

Null 终止符不是编码的一部分,而是某些编程语言(例如 C)使用的字符串表示形式。在 .NET 中,System.String 以 32 位整数形式的字符串长度为前缀,并且不是以 null 结尾的。System.String 在内部始终是 UTF-16,但您可以使用编码来输出不同的表示形式。

对于第二部分...使用 System.Text 中的类,例如 UTF8Encoding 和 UTF32Encoding 来读取字符串。您只需要根据您的参数选择正确的...

于 2010-12-03T03:39:39.977 回答
1

这对我来说似乎很有效(来自从字节数组中读取 unicode、空终止字符串的实际代码示例):

 //trim null-termination from end of string
 byte[] languageId = ...
 string language = Encoding.Unicode.GetString(languageId, 
                                              0,
                                              languageId.Length).Trim('\0'); 
于 2010-12-03T03:39:52.710 回答
1

空终止符不是字符串的“逻辑”部分;它不被视为有效载荷。它在 C/C++ 中广泛用于指示字符串的结束位置。

话虽如此,您可以拥有嵌入 \0 的字符串,但是您必须小心确保字符串不会被截断。例如 std::string 没有嵌入 \0 的问题。但是,如果执行 c_str() 并且不考虑报告的 length() 您的字符串将出现截断。

于 2010-12-03T03:49:37.263 回答