2011-01-28 83 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字节的值(只需要更多的移位)。