プロが教えるわが家の防犯対策術!

C9 04 65 05 0B 06....
↑のようなバイナリデータをC904,6505,B06...と読み込んでいきたいのですが、short buff;fread(buff,sizeof(short),1,fp);としてもなぜか4C9,565,60B...と前後がひっくり返ってしまいます。そこでchar型で読み込んでC9,4,65,5,B,6...とし、これを結合してC904,6505,B06...としたいのですが、うまいやり方があれば教えていただけないでしょうか?

A 回答 (5件)

前の方の回答と似たようなものですが、



union shortbuff {
unsigned char cr[buffsize];
unsigned short st[bufsizeの半分];
} buff;

fread(buff.cr, 1, buffsize, fp);


以降 buff.st の配列を扱えばいいと思います。
    • good
    • 1

 共用体 union を使って[0],[1]ではなく、単に[1],[0]の順序で文字配列に fgetc(fp) などを用いて2バイト読み込むだけのこと。

位置変換の必要はありません。
dat.string[1]=fgetc(fp);
dat.string[0]=fgetc(fp);




#include <stdio.h>

int main(void) {
union set1 {
char string[2];
unsigned short buff;
} dat;

printf("dat= ");
dat.string[1] = 0xc9;
dat.string[0] = 0x04;
printf("%X,", dat.buff);
dat.string[1] = 0x65;
dat.string[0] = 0x05;
printf("%X,", dat.buff);
dat.string[1] = 0x0b;
dat.string[0] = 0x06;
printf("%X,", dat.buff);
printf("...\n");

return 0;
}
    • good
    • 1

理由は他の方が書いた通り。


上位バイトが先に並ぶバイト列を、CPU毎に上位下位が決まった順序に変換する関数があります。

#include <arpa/inet.h> /* Linux の場合 */
#include <winsock2.h> /* Windows の場合 */

short buf;
fread(buf,sizeof(short),1,fp);
buf = ntohs(buf); /* 他に htohl(long用), htons,htonl(逆変換) もあり */
    • good
    • 2

little endianのコンピュータでは上位、下位のデータが読み込むと逆になります。


これはコンピュータの特性の為、プログラムで対応するしかありません。
一番簡単なのは、上下をヒックリ返す事だと思います。

buff = ((buff >> 8) & 0xff) | (buff << 8);
    • good
    • 0

リトルエンディアンのハードなら普通の動作です。


マクロを使うなりしてchar型の状態で上位と下位の入れ替えを行った後に、shortとして扱うしかないでしょう。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています