我正在读取一个big-endian的二进制流。 BitConverter类自动执行此操作。不幸的是,我需要的浮点转换与BitConverter.ToSingle(byte [])不同,所以我有一个同事的自己的例程。但输入byte []需要是little-endian。有没有人有一种快速的方法来转换byte []数组的字节顺序。当然,我可以交换每个字节,但必须有一个技巧。感谢。
答案 0 :(得分:4)
这是一种在字节数组中更改单个字节的字节顺序的快速方法:
public static unsafe void SwapSingles(byte[] data) {
int cnt = data.Length / 4;
fixed (byte* d = data) {
byte* p = d;
while (cnt-- > 0) {
byte a = *p;
p++;
byte b = *p;
*p = *(p + 1);
p++;
*p = b;
p++;
*(p - 3) = *p;
*p = a;
p++;
}
}
}
答案 1 :(得分:3)
我使用LINQ:
var bytes = new byte[] {0, 0, 0, 1};
var littleEndianBytes = bytes.Reverse().ToArray();
Single x = BitConverter.ToSingle(littleEndianBytes, 0);
您也可以.Skip()
和.Take()
获取内容,或者使用BitConverter方法中的索引。
答案 2 :(得分:0)
你的同事的例行公事是什么样的?如果它显式访问字节,你可以改变代码(或者更确切地说,为big-endian数据创建一个单独的方法)而不是反转字节。