Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为字节[]将创建零字符_C#_Arrays_String_Char_Byte - Fatal编程技术网

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)