假设我有一个固定大小的字节数组和一个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已启用。
答案 0 :(得分:3)
您可以尝试使用BitConverter.ToInt32()
,然后使用CLng()
。 BitConverter
类使用C#'s unsafe code直接将字节数组转换为Integer
(或者至少只要startIndex
参数可被4整除即可):
Dim lHeader As Long = CLng(BitConverter.ToInt32(abHeader, 0))
更新:根据我现在更新的在线测试,一旦JIT(即时)编译器(感谢提醒我,@ JamesThorpe!)完成了它的工作,我们的方法执行得非常相同快。
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())