如何将System.Decimal转换为BigEndian格式发送至大端服务器?
System.Decimal跨小端-大端序列化的正确处理方式
首先明确:.NET 的 System.Decimal 由四个 32 位有符号整数按固定逻辑顺序构成:lo(低32位数值部分)、mid(中32位数值部分)、hi(高32位数值部分)、flags(包含缩放因子、符号位的标志字段)。
针对你提出的三个问题,结论如下:
- 保留 lo、mid、hi 的顺序:正确。这三个字段是 Decimal 数值的核心逻辑组成部分,顺序是固定的,与机器字节序无关,跨端传输时必须保持该逻辑顺序不变。
- 反转每个 lo/mid/hi 整数中的字节:正确。小端机器上的 32 位整数以「低字节在前」的方式存储,而大端机器读取 32 位整数时默认按「高字节在前」解析,因此需要将每个 lo/mid/hi 的字节顺序反转,才能让大端侧得到正确的逻辑整数值。
- 保留 flags 整数的字节顺序:错误。
flags本身也是一个 32 位整数,其内部的符号位(第31位)、缩放因子(第0-15位)都是基于逻辑整数值定义的。小端机器存储的flags字节序与大端机器的解析规则不匹配,因此同样需要反转其字节顺序——否则大端侧解析出的flags数值会错误,导致 Decimal 的符号或小数点位置异常。
你的猜测(反转除第4个元素外的每个整数)不正确,正确的操作步骤是:
- 在小端机器上调用
Decimal.GetBits()获取四个逻辑整数值:lo、mid、hi、flags。 - 对这四个整数分别进行字节序反转(将每个32位整数的小端字节序列转换为大端字节序列)。
- 按
lo→mid→hi→flags的顺序将反转后的字节拼接成字节流,发送至大端服务器。 - 大端服务器接收字节流后,按相同顺序拆分出四个32位大端字节序列,直接解析为整数,再通过
new Decimal(int[])构造出正确的System.Decimal实例。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

