2

実際には 4 バイトの配列 (RegQueryValueEx によって作成) を指すバイトへのポインターがあります。
この 4 バイトを 1 つの DWORD に変換したいと考えています。
非常に単純なようで、確かに既存の方法でそれを行う方法がありますが、見つけることができませんでした。

または: 登録された値は TimeStamp です。TimeStamp を表す 4 バイト配列を文字列に変換するメソッドはありますか?

4

2 に答える 2

5

4 バイトの配列を取得し、それを 32 ビット値に変換する方法について質問していますね。それは実際には非常に単純です (ビットごとの演算子が単純であると考えていると仮定すると):

typedef unsigned int dword;
typedef unsigned char byte;

//Convert an array of four bytes into a 32-bit integer.
dword getDwordFromBytes(byte *b)
{
    return (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
}

これは、整数がリトルエンディアンで格納されていることを前提としています。これは、最下位バイトが最初に格納されることを意味するため、0x1234 という単語がある場合、2 バイト 0x34、0x12 としてこの順序でメモリに格納されます。

ビッグ エンディアンでは、数値 0x1234 はメモリに 0x12、0x34 として格納されます。それが必要な場合は、配列のインデックスを逆にします。つまり、 からb[3]に移動しb[0]ます。

落とし穴の警告:
次のコードは完全に正当な C です。つまり、エラーなしでコンパイルされます。

char c[4];
int x = *((int *)c);

ただし、これは基本的に achar *を anにキャストしてint *逆参照することで機能します。これは、次の移植性の問題を引き起こすため、非常に悪い習慣と見なされます。

  • 上で説明したエンディアンネス。プロセッサ アーキテクチャが異なれば、ワードの格納方法も異なります。たとえば、x86 プロセッサはリトル エンディアンですが、PowerPC はビッグ エンディアンです。上記の構造は、プロセッサが 4 バイト値を解釈する方法について仮定しています。
  • メモリ アライメントの問題。一部のアーキテクチャでは、ワード アクセスをアライメントする必要があります。つまり、マルチバイト メモリ アクセスのアドレスは、ワード サイズの倍数でなければなりません。上記のコードは、アラインされていないアクセスを許可する x86 で動作しますが、68000 などの他のアーキテクチャでは、チョークしてバス エラーが発生します。
    C の変数は、そのサイズに対して適切に配置されることが保証されています。これが意味することは、 anintが 32 ビットの場合、ターゲット システムが必要とする場合、コンパイラはアラインメントを保証する必要があるということです。Achar[4]が 4 バイトにアラインされることは保証されません。
于 2012-07-31T06:43:55.773 に答える
1

MAKEWORDMAKELONGマクロを調べます。

于 2012-08-01T12:40:00.207 に答える