2

我使用尽可能少的字节数以字节等效格式存储数字。在 65535 到 16777215 的范围内,BitConverter 给了我一个 4 字节的数组,但我只想存储 3 个字节。

对于下面的代码,我的数组是[0]254、[1]255、[2]255、[3]0,所以我可以去掉字节[3]。这是在Core i7 proc上。在我的生产代码中,在数组复制之前,我正在检查 BitConverter.IsLittleEndian 以确定我可以截断最后一个字节。

int i = 16777214;
byte[] bytesTemp = BitConverter.GetBytes(i);

byte[] value = null;
if (BitConverter.IsLittleEndian) 
    Array.Copy(bytesTemp, 0, value, 0, 3); 

我的问题是 - 我是否需要关注系统的字节序,或者 CLR 是否只使用这种 LittleEndian 格式?我没有 BigEndian 系统(甚至不知道如何获得)来测试我的字节数组是否以相反的顺序出现。

4

2 回答 2

2

这完全取决于您对数据的处理方式。如果您要将其写入磁盘以实现便携式持久性,那么是的......我可能会关心字节顺序。如果您只是要使用它int在同一进程(或同一台机器上)中重新创建一个,它可能并不重要。

但是,当我确实需要担心字节顺序时,我通常根本无法做到这一点BitConverter ——就个人而言,我很想使用字节掩码和移位;那么你甚至不需要知道字节序——它在任何系统上都一样。它还避免了BitConverter 返回字节数组而不是接受数组和偏移量的恼人的糟糕设计决策。

例如:

byte[] buffer = ...

// write little-endian
buffer[offset++] = (byte)(i & 0xFF);
buffer[offset++] = (byte)((i >> 8) & 0xFF);
buffer[offset++] = (byte)((i >> 16) & 0xFF);
buffer[offset++] = (byte)((i >> 24) & 0xFF);
于 2014-09-25T09:49:16.667 回答
2

是的,根据文档,您需要关注。他们有一个例子,如果架构不是所需的字节序,他们会反转字节。

至于从哪里获得 BigEndian 系统,我认为基于 ARM 的处理器是 big-endian,尽管我没有对此进行测试。因此,例如,如果您在 Win RT 设备或手机上运行,​​您可能会得到不同的行为。

于 2014-09-25T09:52:32.440 回答