バイト配列 (長さ 4) を整数に変換する最良の方法は vb.net にあるのだろうか? BitConverter は知っていますが、4 バイトのメモリをコピーすればできるはずの関数呼び出しを行うのは、かなりもったいないようです。同じように、single/double をバイナリ表現から single/double 変数に変換するのはどうでしょうか。
4 に答える
「メモリのバイトをコピーする」ことは、.NET が特に適していないことです (VB.NET はさらに適していません)。したがって、C への切り替えが選択肢でない限り、関数呼び出しはほとんど避けられません。
BitConverter は、よく考え抜かれたテスト済みの機能です。もちろん、(C# で) 次のようにすることで回避できます。
myInt = (*pbyte) | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);
(ちなみに、これは、バイト配列を整数に変換するときに BitConverter が行うこととまったく同じです...)。
ただし、このコード:
- BitConverter に相当するものよりもはるかに読みにくく、理解するのがはるかに困難です。
- BitConverter が行うエラー チェックは一切行いません。
- BitConverter のように、リトル エンディアンとビッグ エンディアンの表現を区別しません。
言い換えれば、関数呼び出しを「保存」することはできますが、最終的には大幅に悪化します (バグを導入しないと仮定しても)。一般に、.NET Framework は非常によく設計されており、実際の (パフォーマンス) 問題が発生しない限り、その機能の使用についてよく考える必要はありません。
BitConverter は知っていますが、4 バイトのメモリをコピーすればできるはずの関数呼び出しを行うのは、かなりもったいないようです。
一方、私は状況を「まさに私が望むことを行うメソッド呼び出しが既にあるときに、これを行う効率的な方法を手作業でコーディングしようとするのは非常に無駄に思える」と考えています。
この正確なコード部分にパフォーマンスのボトルネックがあると確信している場合を除き、フレームワークによって提供される機能を使用してください。
mdbは正確に正しいですが、とにかくvbバイト配列をリトルエンディアン整数に変換するためのコードがあります...(独自のビットコンバータークラスを作成したい場合に備えて)
'ここで、bits()は長さ4のバイト配列です。
Dim i as Integer
i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))
System.Bufferクラスを使用して、コピーbyte[]からint[]へのブロックをブロックできます。