5

これが以前に尋ねられた場合は許してください。しかし、おそらく私が正しい用語を持っていないために、私はインターネットを精査し、何も現れなかったことを保証します。

整数を取得して、次のようなリトルエンディアン(?)の16進表現に変換したいと思います。

303-> 0x2f010000

16と1の位が両方とも同じバイトにあるようにバイトがパックされており、4096の位と256の位が1バイトを共有していることがわかります。誰かがそのようなエンコーディングの正しい用語を私に指摘することができれば、それを行う方法についての私の答えを見つけることができると確信しています。ありがとう!

4

3 に答える 3

2

ビットごとのANDおよびOR演算子と組み合わせたビットシフト演算子を使用します。

32ビットの符号なしを想定:

int value = 303;
int result = 0x00000000;

for (int i = 0; i < 4; i++)
{
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8)));
}
于 2009-05-20T19:07:18.847 に答える
2

ビッグエンディアンとリトルエンディアンは、メモリ内のバイトの順序を指します。0x2f100000のような値には固有のエンディアンがなく、エンディアンはCPUアーキテクチャによって異なります。

32ビット値のバイトの順序を常に逆にしたい場合は、Demiが投稿したコードを使用してください。

常に特定のバイト順序を取得したい場合(ネットワークを介してそれらのバイトを転送する準備をしている、またはディスクファイルに保存する準備をしているため)、別のものを使用します。たとえば、BSDソケットライブラリには、CPUのネイティブ32ビット値を取得してビッグエンディアンの順序にする関数htonl()があります。

リトルエンディアンのマシンで実行している場合、htonl(303)==0x2f100000。ビッグエンディアンマシンで実行している場合、htonl(303)==303。どちらの場合も、結果はメモリ内のバイト[0x00、0x00、0x01、0x2f]で表されます。

于 2009-05-20T19:51:59.040 に答える
0

誰かが私がやろうとしていたことに特定の用語を付けることができれば、私はまだそれを聞きたいです。しかし、私は必要なことを行う方法を見つけました。誰かが私の面倒を見てくれるように、ここに投稿します。それを行うためのより簡単で直接的な方法があるかもしれませんが(おそらくそうです)、私が望んでいたバイトコードを取り戻すためにVB.Netでやったことは次のとおりです。

Private Function Encode(ByVal original As Integer) as Byte()    
    Dim twofiftysixes As Integer = CInt(Math.Floor(original / 256))
    Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes)) / 16))
    Dim ones As Integer = original Mod 16
    Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0}
    Return bytecode
End Function

整数を効果的に16進コンポーネントに分割し、適切なペアをcBytesに変換します。

于 2009-05-20T21:19:42.870 に答える