Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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# - Fatal编程技术网

C# 将字符串转换为字节数组

C# 将字符串转换为字节数组,c#,C#,我发现这个小片段可以将字符串转换为字节数组: public byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } 这个函数用于将字节数组转换为

我发现这个小片段可以将字符串转换为字节数组:

    public byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
这个函数用于将字节数组转换为字符串:

    public string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }
但我注意到,第一个返回的数组是初始字符串的两倍(因为sizeof(char)=2),数组中的每个其他插槽都是0

例如:

string = TEST
bytes[] = { 84, 0, 69, 0, 83, 0, 84, 0 };
我使用这个函数在UDP中发送数据包,所以我需要我的数据包尽可能小


为什么阵列要大两倍?如何修复它?

.NET实际上使用UTF-16编码来存储
字符串和
字符,这意味着每个字符实际上用2个字节编码。详情如下:

通用语言运行库使用UTF-16编码来表示
Char
String
值,Windows操作系统使用UTF-16编码来表示
WCHAR

因此,您应该期望为字符串中的每个字符获得2个字节

如果希望每个字符只获得1个字节,则必须使用不同的编码。对于此输入,将工作:

public byte[] GetBytes(string str)
{
    return System.Text.Encoding.ASCII.GetBytes(str);
}

使用输入调用此函数将返回
{84,69,83,84}

以获取字符串使用的字节:

Encoding.Utf8.GetBytes()
Encoding.Utf8.GetString()

要返回到字符串,请使用:

Encoding.Utf8.GetBytes()
Encoding.Utf8.GetString()
在C#中,是一种16位数据类型,因为.NET本机使用Unicode UTF-16编码

如果测试完全是ASCII数据,则可以使用将字符串转换为使用ASCII编码的字节

最好使用UTF8编码将其转换为字节。这支持整个Unicode字符集,不仅仅是ASCII字符集,而且编码方式不象UTF16那样包含所有这些零字节


如果你需要学习更多关于字符编码的知识,还有一个问题。

@AK_uuu当然可以,但你永远不知道OP会用它来做什么。如果他/她真的需要字符和字节之间的1:1对应关系,UTF-8也不起作用。我在回答中显示了ASCII,因为我认为这是OP最可能熟悉的编码。UTF8与ASCII兼容,即从0x00到0x7F的字符,在这两种情况下都会表示相同。。。