【发布时间】:2020-06-09 22:29:00
【问题描述】:
我在图书馆的设计中达到了一个让我对字节序感到恐惧的地步。
我可以轻松处理字节顺序,但是位顺序在我的代码中引入了巨大的复杂性。
我正在做的是将uint 转换为字节,以网络字节顺序(大端)。
但是,我将最重要的碎屑(2 位,从第一个 [最重要] 字节开始)用于其他内容,存储另一个数字。
通常,我使用这些行来编写和读取面包屑:
bytes[0] |= 0xC0 // Writing 11 to the most significant crumb. It could be 10 or 01 too. Before the disjunction, I know those two bits are 0.
(bytes[0] & 0xC0) >> 6 // Getting the most significant crumb and shifting it to the right, in the least significant place.
对我来说,所有这些似乎都假设最重要的位在前。
如果没有,我这对操作基本上会把 00000011 变成 00001100,这不是我需要的值。
这些数据存储在一个文件中,可以在其他地方访问。如果存储机和读取机使用不同的位顺序,读取器就会得到垃圾。
我也不记得曾经读过一段对位顺序做出反应的代码。
所以,我的问题是:我是偏执狂还是我的 C# 库可以在 LSB 优先的机器上使用? (在 .NET 或 Mono 下;Windows、Unix、Android、iOS 等)
如果是这样,我怎样才能有效地处理这些可能性并能够正确检索我的 2 位数字?
【问题讨论】:
-
Endian 不影响位序,只影响字节序。
-
en.wikipedia.org/wiki/Bit_numbering 好像每个人都认为最重要的位在前……
-
我认为所有 .NET 实现都应该以相同的方式对待字节序(我认为这是规范的一部分),但是,我可能错了。但是,我会考虑在图书馆中唯一考虑错误字节序的地方是图书馆的输入点,即。任何公开的方法并接受可能出错的东西。
-
没有“第一”。最重要的位是.. 最重要的。这既不是第一个也不是最后一个。您无法在系统上进行任何可以显示差异的测量 - 整数运算符始终以完全相同的方式工作。
-
@harold 是的:您只需将原始字节读取为字节,例如使用
unsafe代码将int变量视为byte*
标签: c# bit-manipulation