Networking 在通过网络发送浮点数之前对浮点数进行位移位的原因是什么

Networking 在通过网络发送浮点数之前对浮点数进行位移位的原因是什么,networking,bit-shift,Networking,Bit Shift,我与Unity和C#合作——在制作多人游戏时,有人告诉我,当涉及到像浮动位置这样的值时,我应该在发送它们之前对它们使用位移位运算符,并在接收时反转操作。我被告知这不仅允许更大的数值,而且能够保持可能丢失的浮点精度。但是,如果我不必这样做,我不希望每次收到数据包时都运行此操作,除非我必须这样做。尽管瓶颈似乎是对接收到的字节的实际解析。尤其是在没有消息帧和试图从字符串移动到字节数组的情况下。(但那是另一个故事!) 我的问题是: 这些是接受手术的正当理由吗?他们的陈述准确吗? 如果不是,我应该在我的浮

我与Unity和C#合作——在制作多人游戏时,有人告诉我,当涉及到像浮动位置这样的值时,我应该在发送它们之前对它们使用位移位运算符,并在接收时反转操作。我被告知这不仅允许更大的数值,而且能够保持可能丢失的浮点精度。但是,如果我不必这样做,我不希望每次收到数据包时都运行此操作,除非我必须这样做。尽管瓶颈似乎是对接收到的字节的实际解析。尤其是在没有消息帧和试图从字符串移动到字节数组的情况下。(但那是另一个故事!)

我的问题是:

这些是接受手术的正当理由吗?他们的陈述准确吗? 如果不是,我应该在我的浮动上运行位移位操作吗? 如果我应该这样做,真正的原因是什么

如有任何补充信息,将不胜感激

我指的资源之一是:

在网络字节顺序之间来回切换的主要原因是为了解决由此引起的问题,主要是为了确保多字节值(长、int,但也浮动)的每个字节的读写方式都相同,无论架构如何,结果都相同。如果您确信您正在使用相同的endianness在系统之间交换数据,那么理论上可以忽略这个问题,但从一开始这就不是一个好主意,因为您只是简单地创建无需的异常,并在代码中保留不合理的异常(“这一切都可以工作,但只在相同的endianness上。会出什么问题?”)


根据您的应用程序体系结构,您可以在收到数据包负载/数据后重写该数据包负载/数据,然后在代码中进一步使用该版本。还请注意,在发送数据之前,您需要再次对数据进行编码。

主要原因:规范化和终结性:@MarcinOrlowski-如中所述,在不同的操作系统上,浮点值可能不同,并且在不同的机器上呈现不同的值?是的,浮点值可能与终结性相关。还有其他原因吗?如果你想把它作为答案,我会投赞成票。我张贴了常规答案。Endianness是一个原因。因此它不能用于允许大于65536的值,如果我在发送之前和接收之后运行一个按位操作,它运行的环境将把它转换为具有正确endian的浮点值?对不起,如果我是多余的,我只是想确定一下。不,因为endianess是关于字节顺序而不是字节计数的。你还是我。E.前后16位-只需正确处理它,因此,如果需要超过65535个字节,则需要超过2个字节。对于值,如C#的
uint
ulong