C#
1 //10進数32bit 1120403456 2 3 //16進数32bit 42c80000 4 5 //2進数16bit 6 //0100 0010 1100 1000 0000 0000 0000 0000 //+100(2進数) 7 //1100 0010 1100 1000 0000 0000 0000 0000 //-100(2進数) 8 uint a = 1120403456; 9 uint g = 3267887104; 10 string bin = "42C80000"; 11 string n; 12 float f; 13 n = Convert.ToString(g, 2); 14 Console.WriteLine(n); 15 f = Convert.ToSingle(n); 16 Console.WriteLine(f); 17```C# 18コード
string text = "12.34";
Console.WriteLine(Convert.ToUInt32(Convert.ToSingle(text)));
追記/* 出力は12になります。 12.34の10進数32bitは1095069860のようにならないのですが間違っているところ足りないところを教えていただきたいです。 */ データをもらうときは、float=100であったりfloat=10.1であったりするのですが 通信機器から直接floatでもらえないためaやgの16進数32bitで受け取ってます。 aやgを2進数に変換した後、floatに戻すにあたって100ではなく1.00001E+30このような形になります。 おそらく正規化などのようなことをする必要があると思うんですが 理解ができないため教えてほしいです。 どういったやり方が最善なのでしょうか。
正規表現タグは質問と関係ないので外してください。
細かいですねww
> 通信機器から直接floatでもらえないためaやgの16進数32bitで受け取ってます。
その通信機器のメーカーのデータ仕様書を見るなり、問い合わせるなりすればいいだけの話では。
送信側が例えば「100」や「10.1」を送るとして、受信側が16進数32ビットで受け取ると結局どういう値になっているのか。送信側が送っている「32ビットの浮動小数点数形式のバイナリの値をそのまま受け取っている」ということなのでしょうか。それとも32ビット分の値を16進数表記の文字列で受け取っているということなのでしょうか。
質問内容から(少なくとも私は)良く分かりませんでした。
それは正規化ではありませんね。
2進数で表記したものを10進数で読んで単に値が間違っているだけです。
私などはunsafeポインタを使いたくなりますがたぶんactorbugさんの回答が正当でしょう。
本欄[2021/05/25 04:17]の私のコメントより:
> 送信側が送っている「32ビットの浮動小数点数形式のバイナリの値をそのまま受け取っている」ということなのでしょうか。
こちらであった様子。
$ cat t1.c
#include <stdio.h>
int main() {
union {
float ff;
unsigned char cc[4];
} u;
u.ff = 100.0;
printf("%02X %02X %02X %02X\n", u.cc[0], u.cc[1], u.cc[2], u.cc[3]);
return 0;
}
$ gcc -Wall t1.c;./a.out
00 00 C8 42
ありがとうございます。
参考にさせて頂きます!
回答1件
あなたの回答
tips
プレビュー