代码之家  ›  专栏  ›  技术社区  ›  Kibbee

在VB.NET中将字节数组转换为整数

  •  4
  • Kibbee  · 技术社区  · 16 年前

    我想知道在vb.net中,将字节数组(长度4)转换为整数的最佳方法是什么?我知道bitconverter,但是做一个函数调用来做一些应该可以通过复制4字节内存来完成的事情似乎是浪费。沿着同一行,将一个单/双变量从它的二进制表示转换为一个单/双变量。

    4 回复  |  直到 16 年前
        1
  •  20
  •   mdb    16 年前

    “复制内存字节”是.NET特别不适合的东西(而vb.net更不适合)。所以,除非切换到C是一个选项,否则函数调用是不可避免的。

    Bitconverter是一个经过深思熟虑和测试的功能。当然,你可以通过(用c)这样的方式来避免:

    myInt = (*pbyte) | (*(pbyte + 1) << 8)  | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);
    

    (顺便说一下, 确切地 当将字节数组转换为整数时,bitconverter为您做了什么…)。

    但是,此代码:

    • 比同等的Bitconverter更难阅读和理解;
    • 不做任何错误检查,比康弗特为你做的;
    • 并不像bitconverter那样区分小endian和大endian表示。

    换言之:您可能会“保存”一个函数调用,但最终会严重恶化(即使假设您没有引入任何错误)。通常,.NET框架的设计非常非常好,除非遇到实际的(性能)问题,否则您不应该对使用它的功能三思而后行。

        2
  •  8
  •   Jon Skeet    16 年前

    我知道这个婊子养的,但是它 做一个 函数调用以执行 应该可以通过复制4来完成 内存字节。

    然而,我认为这种情况是“当已经有了一个方法调用可以完全满足我的需要时,试图用一种有效的方法来编写代码似乎是一种浪费。”

    除非你是 完全确信 如果在这段代码中存在性能瓶颈,请使用框架提供的功能。

        3
  •  2
  •   sbeskur    16 年前

    mdb是完全正确的,但这里有一些代码可以将vb字节数组转换为小endian整数…(以防编写自己的bitconverter类)

    '其中bits()是长度为4的字节数组

    Dim i as Integer 
    
    i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))
    
        4
  •  1
  •   Ihar Bury    16 年前

    可以使用System.Buffer类阻止将字节[]复制到int[]。