C# 将字符串转换为字节[]将创建零字符
在这个转换函数中C# 将字符串转换为字节[]将创建零字符,c#,arrays,string,char,byte,C#,Arrays,String,Char,Byte,在这个转换函数中 public static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } byte[] test = GetBytes("abc"); 结果数组包含零个字符 te
public static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
byte[] test = GetBytes("abc");
结果数组包含零个字符
test = [97, 0, 98, 0, 99, 0]
当我们将字节[]转换回字符串时,结果是
string test = "a b c "
我们如何使它不会创建那些零呢?请尝试显式地指定编码。您可以使用下一个代码将字符串转换为具有指定编码的字节
byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abc");
如果打印字节的内容,将得到{97,
98,
99},它不包含零,如您的示例所示
在您的示例中,默认编码使用每个符号16位。它可以通过打印的结果进行观察
System.Text.Encoding.Unicode.GetBytes("abc"); // { 97, 0, 98, 0, 99, 0 }
然后,在将其转换回时,应选择适当的编码:
string str = System.Text.Encoding.ASCII.GetString(bytes);
Console.WriteLine (str);
按照您的预期打印abc首先,让我们看看您的代码有哪些错误。在.NET framework中为16位2字节。也就是说,当您编写sizeofchar时,它返回2。str.Length是1,所以实际上您的代码将是byte[]bytes=新字节[2]是相同的字节[2]。所以,当您使用该方法时,实际上是将2个字节从源数组复制到目标数组。这意味着您的GetBytes方法返回字节[0]=32,如果字符串为空,则返回字节[1]=0 试着用它来代替 在派生类中重写时,对 将指定的字符串转换为字节序列 输出:
83 = S
111 = o
110 = n
101 = e
114 = r
32 =
71 = G
111 = o
110 = n
117 = u
108 = l
97,0是“a”的Unicode表示形式。Unicode以两个字节表示每个字符。所以不能删除零。但您可以将编码更改为ASCII。请尝试将字符串转换为字节[]
byte[] array = Encoding.ASCII.GetBytes(input);
为了消除对答案的混淆,C中的字符类型需要2个字节。因此,string.toCharArray返回一个数组,其中每个项占用2字节的存储空间。在复制到字节数组(其中每个项占用1字节的存储空间)时,会发生数据丢失。因此,结果中出现了零。
正如所建议的那样,Encoding.ASCII.GetBytes是一个更安全的选择。在现实中,至少对于4.0,当使用BinaryWriter序列化时.net会自动更改字符大小 具有可变长度的UTF-8字符可能不是1字节,ASCII字符具有1字节 ē=2字节 “e”=1字节 使用时必须记住这一点
BinaryReader.ReadChars(stream)
在wordēvalds=7字节的情况下,大小将不同于evalds=6字节当您将字符复制到字节数组中时,这些零似乎是故意创建的。。你想要什么样的编码?ASCII码?UTF-8?如名称所示,ToCharArray的可能副本返回char[]。字符为16位,即2字节。因此,即使对于简单的ASCII文本,您也会得到一个值为0的额外字节。@请看我的更新答案。或者使用Unicode编码将他从GetBytes中得到的内容转换回来:string str=System.text.Encoding.Unicode.GetStringbytes;然后它也应该与非Ascii一起工作。不过,您应该始终指定两种方式的编码:byte[]bytes=System.Text.encoding.Unicode.GetBytesabc;请注意,默认Unicode编码是little endian,如果您计划进行联网和交换endian或使用C以外的其他语言。没有数据丢失,它实际上与Encoding.Unicode.GetBytes相同,后者编码为UTF16 little endian。UTF-8字符有2个字节。。。什么UTF-8是一种可变长度编码。
BinaryReader.ReadChars(stream)