2009-10-21 90 views
5

我正在从大端的二进制流中读取数据。 BitConverter类自动执行此操作。不幸的是,我需要的浮点转换与BitConverter.ToSingle(byte [])不一样,所以我有来自同事的自己的例程。但输入字节[]需要小端。有没有人有一个快速的方法来转换byte []数组的字节顺序。当然,我可以交换每个字节,但必须有一个技巧。谢谢。在C#中从大端到小端交换字节的快速方法

回答

0

你的同事的例程是什么样的?如果显式访问字节,则可以更改代码(或者更确切地说,为big-endian数据创建一个单独的方法),而不是颠倒字节。

+0

我需要预先在消息对象中转换数组。 – initialZero 2009-10-21 20:14:21

+0

乔恩,不MiscUtil有一个EndianBitConverter? – LBushkin 2009-10-21 20:16:24

+1

@LBushkin:它的确如此,这是我的第一个想法 - 但这听起来像是一个不同的问题。 – 2009-10-21 20:16:48

3

这里是一个字节数组改变字节序单打的快速方法:

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++; 
    } 
    } 
} 
+0

说我在十六进制输入是62,4d,00,4e然后输出我认为应该是49,62,4e,00,但这可能是因为我在16位字工作。 SwapSingles返回4e,00,4d,62这不是我所需要的。 – initialZero 2009-10-23 00:07:45

+0

@initialZero:单个是四个字节。那么,你是没有字节还是它们不代表Single? – Guffa 2009-10-23 09:00:14

4

我使用LINQ:

var bytes = new byte[] {0, 0, 0, 1}; 
var littleEndianBytes = bytes.Reverse().ToArray(); 
Single x = BitConverter.ToSingle(littleEndianBytes, 0); 

您也可以.Skip().Take()你的心脏的内容,否则在BitConverter方法中使用索引。

+0

请注意,'Array.Reverse()'是一种老式的方法。 – Pat 2010-03-18 22:54:25

+0

快速实施?也许。在运行时快速?可能不会。 – ulrichb 2016-03-04 09:59:12

+0

@Pat Array.Reverse修改原始数组,而.Reverse()。ToArray()创建一个新数组。巨大的差异。没有关于新旧方法。 – juFo 2017-06-27 13:52:57