2011-01-28 61 views
1

我正在寫一個二進制文件轉換器,我需要將1-6字節的數組轉換爲int(short-long)值。目前我正在使用以下三個功能,但我想知道是否有改進性能的方法?如何提高將byte []轉換爲int的性能?

private string byteToShortParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[2]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt16(workingSet, 0).ToString()); 
} 

private string byteToIntParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[4]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt32(workingSet, 0).ToString()); 
} 

private string byteToLongParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[8]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt32(workingSet, 0).ToString()); 
} 
+0

如果你正在處理的字節真的沒有太多的優化,你需要做的。 – BoltClock 2011-01-28 20:46:12

+0

yes recordData是一個bytearray – Asha 2011-01-28 20:47:54

+1

這對codereview.stackexchange.com來說是一個很好的問題 – 2011-01-28 20:48:06

回答

1

EDIT2:

我想,如果你需要轉換爲int的字節數是可變長度(這似乎奇怪),我建議做這種方式:

private string bytesToIntParse(byte[] recordData, int offset, int length) 
{ 
    long result = 0; 
    for (int i = 0; i < length; ++i) 
    { 
     result |= ((long)recordData[i + offset]) << (i * 8); 
    } 
    return result.ToString(); 
} 

現在你有一個函數,沒有Buffer.BlockCopy,它支持任何長度。

EDIT1:

你可以使用不安全的代碼,如:

// I don't think you need to specify a length parameter, since int32 is always 4 bytes 
private string byteToIntParse(byte[] recordData, int offset, int length) 
{ 
    unsafe 
    { 
     fixed (byte* p = &recordData[offset]) 
     { 
      // This result will differ on little and big endian architectures. 
      return (*(int*)p).ToString(); 
     } 
    } 
} 

但是,這是什麼BitConverter內部呢,所以我不認爲你會獲得任何性能

你爲什麼要複製字節到workingSet?你只可以:

return BitConverter.ToInt32(recordData, offset).ToString()

我想這會帶來性能提升,因爲你沒有打電話Buffer.BlockCopy每次:P

1

是的,最佳的變體都將

private string byteToShortParse(byte[] recordData, int offset, int length) 
    { 
     if (length == 2) 
     { 
      short i = (recordData[offset + 1] << 8) | recordData[offset]; 
      return i.ToString; 
     } else return ""; 

    } 

這同樣適用於4字節和8字節的值(只需要更多的移位)。