我正在尝试从字节数组中读取一个以空字符结尾的字符串;该函数的参数是编码。
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编码,我的算法将达到第二个字节后面的“null终结符”。
所以我有一个双重问题:null终止符是编码的一部分吗?如果没有,我怎么能逐个字符地解码字符串并检查以下字节的空终止符?
提前致谢
(建议也表示赞赏)
编辑:
如果“foo”为空终止并且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
答案 0 :(得分:1)
Null终结符不是编码的一部分,而是某些编程语言使用的字符串表示形式,例如C.在.NET中,System.String以字符串长度作为32位整数作为前缀而不是null-终止。内部System.String总是UTF-16,但您可以使用编码输出不同的表示。
对于第二部分...使用System.Text中的类(如UTF8Encoding和UTF32Encoding)来读取字符串。您只需根据参数选择正确的...
答案 1 :(得分:1)
这似乎对我有用(来自实际代码的示例,它从字节数组中读取unicode,空终止字符串):
//trim null-termination from end of string
byte[] languageId = ...
string language = Encoding.Unicode.GetString(languageId,
0,
languageId.Length).Trim('\0');
答案 2 :(得分:1)
null终止符不是字符串的“逻辑”部分;它不被视为有效载荷。它在C / C ++中被广泛用于指示字符串结束的位置。
说过你可以拥有嵌入式\ 0的字符串,但是你必须小心确保字符串不会被截断。例如,std :: string对嵌入式\ 0没有问题。但是,如果执行c_str()而不考虑报告的长度(),则您的字符串将显示为截断。