在C#中从大端到小端交换字节的快速方法
我正在从大端的二进制流中读取数据。 BitConverter类自动执行此操作。不幸的是,我需要的浮点转换与BitConverter.ToSingle(byte [])不一样,所以我有来自同事的自己的例程。但输入字节[]需要小端。有没有人有一个快速的方法来转换byte []数组的字节顺序。当然,我可以交换每个字节,但必须有一个技巧。谢谢。在C#中从大端到小端交换字节的快速方法
你的同事的例程是什么样的?如果显式访问字节,则可以更改代码(或者更确切地说,为big-endian数据创建一个单独的方法),而不是颠倒字节。
这里是一个字节数组改变字节序单打的快速方法:
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++;
}
}
}
说我在十六进制输入是62,4d,00,4e然后输出我认为应该是49,62,4e,00,但这可能是因为我在16位字工作。 SwapSingles返回4e,00,4d,62这不是我所需要的。 – initialZero 2009-10-23 00:07:45
@initialZero:单个是四个字节。那么,你是没有字节还是它们不代表Single? – Guffa 2009-10-23 09:00:14
我使用LINQ:
var bytes = new byte[] {0, 0, 0, 1};
var littleEndianBytes = bytes.Reverse().ToArray();
Single x = BitConverter.ToSingle(littleEndianBytes, 0);
您也可以.Skip()
和.Take()
你的心脏的内容,否则在BitConverter方法中使用索引。
我需要预先在消息对象中转换数组。 – initialZero 2009-10-21 20:14:21
乔恩,不MiscUtil有一个EndianBitConverter? – LBushkin 2009-10-21 20:16:24
@LBushkin:它的确如此,这是我的第一个想法 - 但这听起来像是一个不同的问题。 – 2009-10-21 20:16:48