実際には 4 バイトの配列 (RegQueryValueEx によって作成) を指すバイトへのポインターがあります。
この 4 バイトを 1 つの DWORD に変換したいと考えています。
非常に単純なようで、確かに既存の方法でそれを行う方法がありますが、見つけることができませんでした。
または: 登録された値は TimeStamp です。TimeStamp を表す 4 バイト配列を文字列に変換するメソッドはありますか?
実際には 4 バイトの配列 (RegQueryValueEx によって作成) を指すバイトへのポインターがあります。
この 4 バイトを 1 つの DWORD に変換したいと考えています。
非常に単純なようで、確かに既存の方法でそれを行う方法がありますが、見つけることができませんでした。
または: 登録された値は TimeStamp です。TimeStamp を表す 4 バイト配列を文字列に変換するメソッドはありますか?
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 *
逆参照することで機能します。これは、次の移植性の問題を引き起こすため、非常に悪い習慣と見なされます。
int
が 32 ビットの場合、ターゲット システムが必要とする場合、コンパイラはアラインメントを保証する必要があるということです。Achar[4]
が 4 バイトにアラインされることは保証されません。MAKEWORDMAKELONGマクロを調べます。