是否有更有效的方法将4个字节转换为长整数?

时间:2017-07-11 05:45:27

标签: vb.net casting

假设我有一个固定大小的字节数组和一个long:

Dim abHeader(0 To 3) As Byte
Dim lHeader As Long

要将bytes数组传输到Long,数组索引3位于Long的8 LSB,我目前使用:

lHeader = (CLng(abHeader(0)) << 24) _
       Or (CLng(abHeader(1)) << 16) _
       Or (CLng(abHeader(2)) << 8) _
       Or (CLng(abHeader(3)))

在VB.NET中执行此任务是否有计算更有效的方法? (它被用于时间关键的循环中。)

注意:Option Strict已启用。

2 个答案:

答案 0 :(得分:3)

您可以尝试使用BitConverter.ToInt32(),然后使用CLng()BitConverter类使用C#'s unsafe code直接将字节数组转换为Integer(或者至少只要startIndex参数可被4整除即可):

Dim lHeader As Long = CLng(BitConverter.ToInt32(abHeader, 0))

更新:根据我现在更新的在线测试,一旦JIT(即时)编译器(感谢提醒我,@ JamesThorpe!)完成了它的工作,我们的方法执行得非常相同快。

链接: http://ideone.com/lhJ61J

Bitwise Or              : 32767
Compile time            : 00:00:00.0000725
1M iterations avg.      : 00:00:00.0000003

Convert.ToInt64()       : <CAST ERROR>
Compile time            : ???

BitConverter.ToInt32()  : 32767
Compile time            : 00:00:00.0001834
1M iterations avg.      : 00:00:00.0000003

现在,如果您的应用程序无法处理执行 0.3微秒 (0,0003毫秒)的代码,那么我不知道该怎么做告诉你。 ;)

答案 1 :(得分:0)

The length of the Byte array needs to be 8 as size of long/int64 is 8

Dim abHeader(0 To 7) As Byte
Dim lHeader As Long = BitConvert.ToInt64(abHeader)

或更改字节顺序:

Dim lHeader As Long = BitConvert.ToInt64(abHeader.Reverse())