我正在读取一个大端字节流。BitConverter类可以自动处理这个问题。不幸的是,我需要的浮点数转换并不同于BitConverter.ToSingle(byte[]),因此我从我的同事那里得到了一种自己的方法。但输入的byte[]数组需要是小端的。有人知道一种快速的方法来转换byte[]数组的字节序吗?当然,我可以交换每个字节,但应该有更简单的方法。谢谢。
我正在读取一个大端字节流。BitConverter类可以自动处理这个问题。不幸的是,我需要的浮点数转换并不同于BitConverter.ToSingle(byte[]),因此我从我的同事那里得到了一种自己的方法。但输入的byte[]数组需要是小端的。有人知道一种快速的方法来转换byte[]数组的字节序吗?当然,我可以交换每个字节,但应该有更简单的方法。谢谢。
以下是一种快速更改字节数组中单精度浮点数大小端的方法:
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++;
}
}
}
我使用LINQ:
var bytes = new byte[] {0, 0, 0, 1};
var littleEndianBytes = bytes.Reverse().ToArray();
Single x = BitConverter.ToSingle(littleEndianBytes, 0);
您可以尽情使用 .Skip()
和 .Take()
方法,或者在 BitConverter 方法中使用索引。
Array.Reverse()
是一种旧的方法。 - Pat你的同事编写的程序是什么样子的?如果它显式地访问字节,你可以改变代码(或者创建一个专门处理大端数据的方法),而不是翻转字节。