• 締切済み

char型2つを結合し、short型に格納したい

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...としたいのですが、うまいやり方があれば教えていただけないでしょうか?

みんなの回答

回答No.5

前の方の回答と似たようなものですが、 union shortbuff { unsigned char cr[buffsize]; unsigned short st[bufsizeの半分]; } buff; fread(buff.cr, 1, buffsize, fp); 以降 buff.st の配列を扱えばいいと思います。

回答No.4

 共用体 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; }

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.3

理由は他の方が書いた通り。 上位バイトが先に並ぶバイト列を、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(逆変換) もあり */

  • a1_s
  • ベストアンサー率28% (4/14)
回答No.2

little endianのコンピュータでは上位、下位のデータが読み込むと逆になります。 これはコンピュータの特性の為、プログラムで対応するしかありません。 一番簡単なのは、上下をヒックリ返す事だと思います。 buff = ((buff >> 8) & 0xff) | (buff << 8);

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

リトルエンディアンのハードなら普通の動作です。 マクロを使うなりしてchar型の状態で上位と下位の入れ替えを行った後に、shortとして扱うしかないでしょう。

関連するQ&A

専門家に質問してみよう