- 締切済み
バイトスワップをやりたい
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 に成りたいです。 本当にすみませんですが、出来れば教えてください。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- hanpen128
- ベストアンサー率0% (0/0)
回答No.3の「ビット配列のエンディアンを変換する用途を想定するならば、」は誤りで 「バイト配列のエンディアンを変換する用途を想定するならば、」だと思います。 バイトオーダーの切り替え処理に関する質問であってビット・ナンバリングの話ではないと思うので。
- Ogre7077
- ベストアンサー率65% (170/258)
ネットワーク出力やファイル出力に使用するために、 ビット配列のエンディアンを変換する用途を想定するならば、 汎用的に実装しては如何でしょうか。 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形式の場合)
下のような事をしたいのでしょうけれど、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; }
お礼
どうもありがとうございました。勉強になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
どこができなくて困っているのですか? ちなみに「インプットはdoubleなら」のところは本気で何を言っているのかさっぱり分からない.
お礼
どうもありがとうございました。勉強になりました。