2014-09-25 30 views
1

我存储数字的字节等效格式,使用尽可能少的字节数。在范围65535到16777215之间,BitConverter给了我一个4字节的数组,但我只想存储3个字节。什么字节顺序BitConverter.IsLittleEndian = false时

对于下面的代码,我的数组[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系统(甚至不知道如何得到它)来测试我的字节数组是否以相反的顺序出现。

+0

这取决于计算机体系结构,大多数体系结构都是LittleEndian。但是.Net代码可以在BigEndian架构上运行 - .NET Micro Framework可以运行在big-endian上。 4.1版增加了对big-endian的支持。 – Donal 2014-09-25 09:49:27

+0

我希望你不要这样做,以节省空间。 – Rawling 2014-09-25 09:53:35

+0

如果空间是你关心的 - 你可以考虑像“varint”这样的东西;这需要0-127个字节; 2字节128-16,383; 3个字节16,384至2,097,151; 4个字节,2,097,152至268,435,455;和5个字节为268,435,456到4,294,967,295(假设无符号等) - 并且已经定义了字节顺序(/ cc @Rawling)(实际上,5字节会一直到34,359,738,367 - 如果你确实需要的话) – 2014-09-25 10:01:32

回答

1

是,根据documentation,你需要关心。他们有一个例子,如果体系结构不是所需的端点,它们会颠倒字节。至于在哪里获得BigEndian系统,我认为基于ARM的处理器是大端的,尽管我还没有测试过这个。因此,例如,如果您在Win RT设备或手机上运行,​​您可能会得到不同的行为。

+0

Itaniums也是大端的,虽然IIRC他们可以运行单个进程litle-endian,如果需要的话,再次IIRC:当运行.NET时,他们总是最终成为little-endian – 2014-09-25 09:55:13

+0

这基本上回答了我的问题 - 是的我需要担心,我错过了MSDN文档中的那一点(所以我现在有一个检查和一个array.reverse时需要)。不过,@MarcGravell提到了varint,这也很有帮助。 – winnt93 2014-09-25 13:12:59

2

这完全取决于你在处理数据。如果你打算把它写到磁盘上进行可移植的持久化,那么是的......我可能会关心字节序。如果您稍后将在相同过程(或同一台机器上)中使用它来重新创建int,则可能无关紧要。

然而,当我必要担心字节顺序,我通常不acheive通过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); 
+0

在这里可能会有点偏离主题,但为什么你是否认为创建并返回数组而不是接受它是一个糟糕的决定? – 2014-09-25 09:52:00

+1

@TheodorosChatzigiannakis不必要的数组分配;在大多数情况下,你想要一个值的字节,你已经在使用本地缓冲区了 - 这将是很好的能够使用:'BitConverter.GetBytes(我,缓冲区,偏移量);' – 2014-09-25 09:53:29

+0

'这完全取决于什么你正在处理数据 - 好吧,他试图删除多余的'0'字节,所以我非常肯定他应该关心字节序。 – Rawling 2014-09-25 09:55:14