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.4
- 回答日時:
回答No.3の「ビット配列のエンディアンを変換する用途を想定するならば、」は誤りで
「バイト配列のエンディアンを変換する用途を想定するならば、」だと思います。
バイトオーダーの切り替え処理に関する質問であってビット・ナンバリングの話ではないと思うので。
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形式の場合)
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- FX・外国為替取引 買スワップについて 1 2022/07/16 15:06
- 経済 円安が急速に進む状況で、韓国との通貨スワップ再開などやらかしたら致命的な打撃を受けたりするのかな? 3 2022/04/20 08:49
- FX・外国為替取引 『くりっく365』について。 1 2023/02/08 17:01
- FX・外国為替取引 メキシコペソのスワップ投資について(レバレッジ1) 10 2022/12/17 08:06
- 政治 岸田のパーカ!! 5 2023/07/06 16:20
- カスタマイズ(車) 旧車の改造について 僕の曾祖父が残した初期型のN360があります。 最近「運転席の中に親父の幽霊がい 5 2023/05/29 13:15
- 経済 韓国ってトルコとスワップ協定結んでますよね? トルコも韓国も酷い状態になってる場合スワップ協定はどの 3 2022/09/12 16:28
- 経済 日韓スワップ協定再開で日本に何かメリットありますか❔?(・_・;? 9 2023/06/29 22:34
- 銀行・ネットバンキング・信用金庫 知らない番号から電話かかってきると不安になります。SIMスワップか? 先程知らない番号から電話があり 5 2023/08/01 15:12
- 外国株 暗号資産のスワップとトレードの違いについて 1 2023/03/08 13:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
c言語プログラミング実行時エラ...
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
間接操作のレベルとは
-
文字列を任意の場所で分割(spli...
-
const char** p;のとき、free(p...
-
charでの計算?
-
c言語配列の結合についてです。...
-
間接参照のレベルが異なっています
-
ソケット関数について(winsock)
-
atoi( ) の反対をやりたい
-
char型と言うものがまだ理解出...
-
YUV⇔RGB変換がうまくいきません。
-
干支のプログラム
-
c言語の文字列の逆順のプログラ...
-
-'0'の意味について
-
C#からC言語で作成したDLLに文...
-
recvfrom関数の戻り値がおかし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報