プロが教える店舗&オフィスのセキュリティ対策術

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 に成りたいです。

本当にすみませんですが、出来れば教えてください。
宜しくお願い致します。

A 回答 (4件)

回答No.3の「ビット配列のエンディアンを変換する用途を想定するならば、」は誤りで


「バイト配列のエンディアンを変換する用途を想定するならば、」だと思います。

バイトオーダーの切り替え処理に関する質問であってビット・ナンバリングの話ではないと思うので。
    • good
    • 0

ネットワーク出力やファイル出力に使用するために、


ビット配列のエンディアンを変換する用途を想定するならば、
汎用的に実装しては如何でしょうか。

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形式の場合)
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/05/08 20:07

下のような事をしたいのでしょうけれど、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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/05/08 18:53

どこができなくて困っているのですか?



ちなみに「インプットはdoubleなら」のところは本気で何を言っているのかさっぱり分からない.
    • good
    • 0

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