gpt4 book ai didi

c# - 使用 System.Text.Encoding.Unicode.GetBytes(aString) 时是否应该检查字节顺序?

转载 作者:行者123 更新时间:2023-12-05 02:44:42 25 4
gpt4 key购买 nike

我正在编写将数据转换为 byte[] 的东西,通过互联网传输,然后再转换回 Unity 游戏项目的数据。

我使用BitConverter来转换intfloat等,如下例所示:

float aFloat = 312321f;
var bytes = BitConverter.GetBytes(aFloat);
if (BitConverter.IsLittleEndian) Array.Reverse(bytes);

// sending through the internet
byte[] bytes = GetByteArrayFromTheInternet();
if (BitConverter.IsLittleEndian) Array.Reverse(bytes);
float aFloat = BitConverter.ToSingle(bytes, 0);

我在发送数据之前和之后进行字节顺序检查,以确保它们相同。我是否需要为 string 执行此操作?

string aString = "testing";
var bytes = System.Text.Encoding.Unicode.GetBytes(aString);
// if (BitConverter.IsLittleEndian) Array.Reverse(bytes); // Do I need this line?

// sending through the internet
byte[] bytes = GetByteArrayFromTheInternet();
// if (BitConverter.IsLittleEndian) Array.Reverse(bytes); // Do I need this too?
string aString = System.Text.Encoding.Unicode.GetString(bytes);

提前致谢!

最佳答案

I do the endianess check before and after sending the data to make sure they're the same. Do I need to do this for string?

这取决于您在网络上与谁交谈。他们使用什么字节顺序?

在您的第一个示例中,您假设网络协议(protocol)始终float 类型(32 位浮点)作为big-endian 发送。哪个好;传统上,“网络主机顺序”一直是大端,因此它是网络协议(protocol)的一个很好的选择。

但是没有要求网络协议(protocol)遵守该协议(protocol),也没有要求它在内部是自洽的,而且您还没有提供有关您正在实现的协议(protocol)的任何信息。

注意:“网络协议(protocol)”指的是应用层协议(protocol)。这将类似于 HTTP、SMTP、FTP、POP 等。即无论您的应用程序为网络上的字节格式选择什么。

因此,您必须查阅所用协议(protocol)的规范,以了解 Unicode 编码 (UTF16) 数据使用的字节顺序。我会猜测它是大端,因为您的float 值也是。但我不能肯定地说。

请注意,如果网络协议(protocol)确实将文本编码为大端 UTF16,则您无需自己为每个字符交换字节。只需使用 BigEndianUnicode encoding 对象对文本进行编码和解码。它将为您处理字节顺序。

另请注意,使用正确的编码器并不是真正可选的。检查 BitConverter.IsLittleEndian 字段会告诉您当前的 CPU 架构。但是如果网络协议(protocol)上的文本被编码为big-endian,那么即使你运行在big-endian CPU上,你仍然需要使用BigEndianUnicode编码。就像总是可靠地解码大端文本一样,Unicode 编码总是解码文本,就好像它是小端文本一样,即使在大端 CPU 上运行时也是如此.

关于c# - 使用 System.Text.Encoding.Unicode.GetBytes(aString) 时是否应该检查字节顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66300383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com