2017-07-17 20 views
1

所以我創建一個程序,讀取字節數組,並返回值如何使用全十六進制值從字節數組中返回一個字節?

byte[] buffer1 = File.ReadAllBytes(path).Skip(startPos).Take(lengthToExtract).ToArray(); 
byte[] reversed = buffer1.Reverse().ToArray(); 
string buffer2 = ""; 
foreach (var i in reversed) 
{ 
    buffer2 = buffer2 + i.ToString("X") + " "; 
} 
MessageBox.Show(buffer2); 
int size = int.Parse(buffer2.Replace(" ", string.Empty), System.Globalization.NumberStyles.HexNumber); 
return size; 

但是,當我得到的消息框的值的十六進制字符串緩衝區的價值就取出了「不重要」六角數量出來,這弄亂了我的價​​值。例如,如果讀取的字節是0x00,它將返回值爲0,並且我正在向後讀取結果字節,因此:0x04080(0 4 0 80)與0x0040080(00 04 00 80)不同。我需要幫助,這會擾亂我的整個計劃。

回答

1

這裏有2個功能可以使用。 `;通過調用`PadLeft`可以簡化爲`sdata.Append(數據[S]的ToString(「X2」))雙位數和字節順序

public static string HexStringFromArrayChangeEndian(byte[] data) 
    { 
     StringBuilder sdata = new StringBuilder(); 
     for (int s = data.Length - 1; s >= 0; s--) 
      sdata.Append(string.Format("{0:X}", data[s]).PadLeft(2, '0')); 
     return sdata.ToString(); 
    } 

    public static string HexStringFromArraySameEndian(byte[] data) 
    { 
     StringBuilder sdata = new StringBuilder(); 
     for (int s = 0; s < data.Length; s++) 
      sdata.Append(string.Format("{0:X}", data[s]).PadLeft(2, '0')); 
     return sdata.ToString(); 
    } 
+0

你行 - 他們將解決這兩個問題這將防止一堆額外的字符串被創建。 +1雖然使用StringBuilder來防止垃圾回收器生氣。可以更進一步,並使其成爲'StringBuilder sdata = new StringBuilder(data.Length * 2);' –

+0

@LeeHiles當然。那些將會有所改進 –

1

使用i.ToString("X2")。將強制字符串輸出「00」而不是簡化爲「0」

相關問題