【发布时间】:2014-09-25 09:40:39
【问题描述】:
我以字节等效格式存储数字,使用尽可能少的字节数。在 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 系统(甚至不知道如何获得)来测试我的字节数组是否以相反的顺序出现。
【问题讨论】:
-
这取决于计算机架构,大多数架构都是LittleEndian。但是,.Net 代码可以在 BigEndian 架构上运行 - .NET Micro Framework 可以在 big-endian 上运行。 4.1 版增加了对 big-endian 的支持。
-
我希望你这样做不是为了节省空间。
-
如果空间是您关心的问题 - 您可以考虑像“varint”这样的东西; 0-127 需要 1 个字节; 128-16,383 为 2 个字节; 16,384 到 2,097,151 的 3 个字节; 2,097,152 到 268,435,455 的 4 个字节;和 268,435,456 到 4,294,967,295 的 5 个字节(假设无符号等) - 并定义了字节顺序(/cc @Rawling)(实际上,5 个字节带你一直到 34,359,738,367 - 如果你真的需要它)
-
@MarcGravell - 我能找到 varint 的唯一参考是这个 [link]pastebin.com/Qk7LXESQ?
-
@winnt93 这是来自“协议缓冲区”的编码细节;这里:developers.google.com/protocol-buffers/docs/encoding#varints - 基本上,它使用 7 位数据,第 8 位作为继续标志; example reader; example writer
标签: c# bitconverter