4

バイト配列 (長さ 4) を整数に変換する最良の方法は vb.net にあるのだろうか? BitConverter は知っていますが、4 バイトのメモリをコピーすればできるはずの関数呼び出しを行うのは、かなりもったいないようです。同じように、single/double をバイナリ表現から single/double 変数に変換するのはどうでしょうか。

4

4 に答える 4

20

「メモリのバイトをコピーする」ことは、.NET が特に適していないことです (VB.NET はさらに適していません)。したがって、C への切り替えが選択肢でない限り、関数呼び出しはほとんど避けられません。

BitConverter は、よく考え抜かれたテスト済みの機能です。もちろん、(C# で) 次のようにすることで回避できます。

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

(ちなみに、これは、バイト配列を整数に変換するときに BitConverter が行うこととまったく同じです...)。

ただし、このコード:

  • BitConverter に相当するものよりもはるかに読みにくく、理解するのがはるかに困難です。
  • BitConverter が行うエラー チェックは一切行いません。
  • BitConverter のように、リトル エンディアンとビッグ エンディアンの表現を区別しません。

言い換えれば、関数呼び出しを「保存」することはできますが、最終的には大幅に悪化します (バグを導入しないと仮定しても)。一般に、.NET Framework は非常によく設計されており、実際の (パフォーマンス) 問題が発生しない限り、その機能の使用についてよく考える必要はありません。

于 2008-10-22T18:59:55.743 に答える
8

BitConverter は知っていますが、4 バイトのメモリをコピーすればできるはずの関数呼び出しを行うのは、かなりもったいないようです。

一方、私は状況を「まさに私が望むことを行うメソッド呼び出しが既にあるときに、これを行う効率的な方法を手作業でコーディングしようとするのは非常に無駄に思える」と考えています。

この正確なコード部分にパフォーマンスのボトルネックがあると確信している場合を除き、フレームワークによって提供される機能を使用してください。

于 2008-10-22T19:40:59.107 に答える
2

mdbは正確に正しいですが、とにかくvbバイト配列をリトルエンディアン整数に変換するためのコードがあります...(独自のビットコンバータークラスを作成したい場合に備えて)

'ここで、bits()は長さ4のバイト配列です。

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))
于 2008-10-22T19:16:04.760 に答える
1

System.Bufferクラスを使用して、コピーbyte[]からint[]へのブロックをブロックできます。

于 2008-10-22T19:19:11.150 に答える