C# 基于所选编码,空终止符需要多少字节?

C# 基于所选编码,空终止符需要多少字节?,c#,string,C#,String,Encoding.GetByteCount(String)告诉我根据所选编码在byte[]中表示给定的C#字符串需要多少字节,但外部协议要求字符串以null结尾,并且包含字符串的消息的总大小在头中发送 计算我的char[]的大小是否与在GetByteCount(String)的结果中添加1byte一样简单,或者我的空终止符是否也会根据编码的不同而大小不同?如果是,我如何确定这一点 我问的是一般情况,而不是具体的编码 e、 g.int HowManyNullBytesToAdd(编码编码)以字节表

Encoding.GetByteCount(String)
告诉我根据所选编码在
byte[]
中表示给定的C#
字符串需要多少字节,但外部协议要求字符串以null结尾,并且包含字符串的消息的总大小在头中发送

计算我的
char[]
的大小是否与在
GetByteCount(String)
的结果中添加1
byte
一样简单,或者我的空终止符是否也会根据编码的不同而大小不同?如果是,我如何确定这一点

我问的是一般情况,而不是具体的编码


e、 g.
int HowManyNullBytesToAdd(编码编码)

以字节表示字符串的字节数取决于接收方期望的编码。因此,如果您的字符串包含非ascii字符,则下面可能给出不同的结果

var byteCountASCII = System.Text.Encoding.ASCII.GetByteCount(yourCharArray);
var byteCountUTF8 = System.Text.Encoding.UTF8.GetByteCount(yourCharArray);

如果是ASCII,您可以安全地为空字符添加1,但据我所知,例如,UTF16甚至为简单的ASCII字符使用2字节,这也取决于。对于所有常用的编码,您问题的简单答案是

MyEncoding.GetByteCount("\0")

然而,如果你想考虑完全通用性,那么你可能会考虑任意编码,甚至可能不是你或我可以发明的任何标准编码的一部分。然后所有的赌注都输光了。在这个完整的概括性中,我认为您需要更多地了解特定的编码


但是,对于最常用的Unicode编码UTF-8、UTF-16和UTF-32,上面的简单代码是VAID

我想你可以试试GetByteCount(你的字符串+“\0”);我假设发送的大小是字节而不是字符。字符是1字节字符和2字节字符的组合。因此,您不关心字节数组是否终止。您所关心的是在数据之前发送的X字节数。根据“在修改的UTF-8中,空字符被编码为两个字节:0xC0,0x80”,在发送的数据中使用的编码是什么——这就是问题所在。您说“外部协议”有特定的要求,然后您问我们该要求是什么。我们不知道;我们没有编写接受您传递的缓冲区的代码!代码的作者知道他们的期望;这就是你应该问的人。是的,这就是我的问题。。。如何根据编码确定为空字符添加多少额外字节?如果该服务使用c#或java编写,且字符串为unicode,则可能会对每个字符(包括空字符)使用2字节。你必须知道使用什么编码。简单是好的。感谢您确认此解决方案是正确的。是否所有字符串编码的字节数都是线性的?也就是说,
字节数(x)+字节数(y)=字节数(x+y)
?对于许多字符串编码(如运行长度编码)来说,情况并非如此;你知道所有的Unicode编码都是这样吗?(这不是一个修辞问题;我真的不知道答案,我很好奇你是否知道。)@Eric UTF8和UTF16是线性映射,被认为是UTF32的映射。显然,字节长度也是线性的。现在我想你可以发明一种非线性的Unicode编码,但我认为8、16和32是今天存在的全部,不是吗?关于Unicode编码现在存在的东西:你省略了UTF-7,这是很少使用的。快速浏览一下维基百科,就会发现UTF-1基本上没有被使用过,UTF-5和-6被提出但从未被采纳为正式标准,UTF-9和-18是愚人节的笑话。@Eric我以前从未看过UTF-7。相当狂野的西部。它甚至允许编码器以不同的方式编码相同的文本。至于空终止符,我不知道这是否是UTF-7的问题。我确实同意你的观点,尽管
编码
太笼统了,我的笼统陈述至少在理论上是不可持续的。