2009-10-21 95 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