|
> 頭の痛い問題ですね。内部コードは固定にするとしても。
> 実装できた時に考えてみます。
すでにお気付きかも知れませんが、ちょいと補足。
> 使用環境は WinXP,borland C++ compiler 5.5.1
> です。
とのことですので、memcmpで比較が正しくなるようなchar配列(「二」なら{0x00, 0x00, 0x4e, 0x8c})を
単にunsigned int*でキャストすると、いきなりハマりますのでお気をつけて。
x86系のCPUでは、0x00004e8cを表わす32ビット整数のメモリ上の配置は{0x8c, 0x4e, 0x00, 0x00}です。
もちろん、逆にunsigned int配列として比較すると正しくなるような配列をそのままmemcmpに
食わせると、これまたおかしな結果になります。
uint32_array: 32ビット符号なし整数の配列
uint8_array: 8ビット符号なし整数の配列
として、相互変換するときに、 uint32_array[i] = (uint8_array[j] << 24) | (uint8_array[j+1] << 16)
| (uint8_array[j+2] << 8) | uint8_array[j+3];
とか
uint8_array[j] = uint32_array[i] >> 24;
uint8_array[j+1] = (uint32_array[i] >> 16) & 0xff;
uint8_array[j+2] = (uint32_array[i] >> 8) & 0xff;
uint8_array[j+3] = uint32_array[i] & 0xff
とかしてやれば、バイトオーダーがどちらかを知らずとも移植性は保たれます。
(8ビット整数と32ビット整数がある環境なら、ですけれど)
# signedなら、も少し式が複雑になります。
|