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ランキング
-
fgetsなどのときのstdinのバッ...
-
str系関数を使わずに二つの文字...
-
配列をnビットシフトする
-
Win32APIでのエディットボック...
-
型変換
-
全角文字を含んだ文字の並びを...
-
c言語です。
-
下記のプログラムがコンパイラ...
-
c言語の問題の説明、各所ごとに
-
strlen関数と同じ働きをする関...
-
C言語で、入力された、文字列を...
-
double型の値をchar配列に変換...
-
C言語の入力した文字を反転させ...
-
enumの記述について。
-
c言語でソーベルフィルタが作り...
-
宣言による処理の重さ
-
文字列の中から必要なデータを...
-
CStringをwchar_tに変換したい
-
間接操作のレベルとは
-
'const char *' 型は 'char *' ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報