• 締切済み

バイトスワップをやりたい

C言語でバイトスワップをやりたいです。voidポインタを使って インプットを受けます。受けたものをHexに変更して、スワップをします。 スワップしたものを表示します。 例えは、 int value(16)が入りました。それをhexに変更すると、intが4バイトですから、 00 00 00 0F に成ります。それをまたスワップすると 0F 00 00 00 に成りたいです。 インプットはdoubleなら 00 00 00 00 00 00 00 0F に成ります。 スワップすると0F 00 00 00 00 00 00 00 に成りたいです。 本当にすみませんですが、出来れば教えてください。 宜しくお願い致します。

みんなの回答

回答No.4

回答No.3の「ビット配列のエンディアンを変換する用途を想定するならば、」は誤りで 「バイト配列のエンディアンを変換する用途を想定するならば、」だと思います。 バイトオーダーの切り替え処理に関する質問であってビット・ナンバリングの話ではないと思うので。

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.3

ネットワーク出力やファイル出力に使用するために、 ビット配列のエンディアンを変換する用途を想定するならば、 汎用的に実装しては如何でしょうか。 void changeEndian(void* dst, void* src, int size) { int i; unsigned char *p = (unsigned char*)dst; unsigned char *q = (unsigned char*)src; p = p + size; for (i = 0; i < size; i++) *(--p) = *(q++); } // 16ビット整数の変換 short int ax, a = 0x12AB; changeEndian(&ax, &a, sizeof(a)); printf("%04hX, %04hX\n", a, ax); // "12AB, AB12" と表示 // 64ビット整数の変換 long long int cx, c = 0x1234ABCD; changeEndian(&cx, &c, sizeof(c)); printf("%016lX, %016lX\n", c, cx); // "000000001234ABCD, CDAB341200000000" と表示 // 倍精度浮動小数点数の変換 double dx, d = 1.1; changeEndian(&dx, &d, sizeof(d)); printf("%016lX, %016lX\n", *(long*)&d, *(long*)&dx); // "3FF199999999999A, 9A9999999999F13F" と表示(IEEE形式の場合)

Suei
質問者

お礼

どうもありがとうございました。勉強になりました。

noname#208507
noname#208507
回答No.2

下のような事をしたいのでしょうけれど、0x0Fは16ではなく15です。 doubleも何か勘違いをされていますね。 #include <stdio.h> typedef struct {  unsigned char uc0, uc1, uc2, uc3; } uchar4; typedef union {  uchar4 uc4;  int i; } xint; static int value(int num) {  xint y = { .i = num };  unsigned char tmp0 = y.uc4.uc0;  unsigned char tmp1 = y.uc4.uc1;  y.uc4.uc0 = y.uc4.uc3;  y.uc4.uc1 = y.uc4.uc2;  y.uc4.uc2 = tmp1;  y.uc4.uc3 = tmp0;  return y.i; } int main(void) {  int i = value(15);  printf("%08X -> %08X\n", 15, i);  return 0; }

Suei
質問者

お礼

どうもありがとうございました。勉強になりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どこができなくて困っているのですか? ちなみに「インプットはdoubleなら」のところは本気で何を言っているのかさっぱり分からない.

関連するQ&A