人に聞けない痔の悩み、これでスッキリ >>

10進数をIEEE754(HEXコード)に変換する簡単な計算式を教えて下さい
100->42C80000 、0.5->3F000000 等に変換したいのですが、よく分かりません
よろしくお願い致します

このQ&Aに関連する最新のQ&A

A 回答 (1件)

環境が不明ですが、.NETである場合は自力で計算するよりもBitConverterでSingle型をバイト配列化してしまうのがよいかと。


.NET(VB,C#)の単精度浮動小数点数はIEEE754だったと思うので・・・。

Imports System.Runtime.InteropServices
Imports System.IO

Class Sample
Public Shared Function SingleToHex(ByVal Value As Single) As String
Dim bytValue As Byte() = BitConverter.GetBytes(Value)
Dim strHex As String = ""

' リトルエンディアンならバイト配列を逆転させる
If BitConverter.IsLittleEndian Then Array.Reverse(bytValue)

' バイト配列を文字列化
For Each b As Byte In bytValue : strHex += b.ToString("X2") : Next
Return strHex
End Function
End Class

呼び出し例と出力結果です。
Console.WriteLine(Sample.SingleToHex(100.0F)) ' 42C80000
Console.WriteLine(Sample.SingleToHex(0.5F)) ' 3F000000


VB6.0やVBAにはBitConverterがないので、WinAPIのCopyMemoryで変数をバイト配列化することができます。こちらのコードは割愛。必要なら補足出してください。
    • good
    • 0
この回答へのお礼

ちょっとした処理にはExcelが楽でしたので、Excel_VBAでプログラムしていました、変換はできましたが(あまり美しくないので・・・)
こちらに投稿しました
上記を参考に.NETに変更します
*VBAでもチェックしようと思います
どうもスッキリしなかったのですが、これで楽になりました
ありがとうございました

お礼日時:2009/11/12 10:35

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?

10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
10進数の-7.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
計算方法を教えてください。

Aベストアンサー

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を符号無し2進数に変換すると、
 111.1
=1.111*2^2
なので、仮数は
11100000000000000000000
指数の2を127でバイアスすると
2+127=129
これを2進数に直すと
10000001
全て合わせると
11000000111100000000000000000000
になります。
64ビットの場合は、指数のバイアスを127から1023にし、仮数の23ビットを52ビットまで増やせばOKです。

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を...続きを読む

Qfloat 10進数 を float 16進数に変換してくれる電卓アプリを探しています。

おはようございます。

小数点有りの10進数 を float 16進数に
自動変換
してくれる電卓アプリを探しています。

何かいいツールはありませんか?

Aベストアンサー

10進数/16進数というのは、表示の問題。floatというのは内部表現の問題。
なので、float16進数というのは意味が通りません。
浮動小数点数の内部表現を表示してくれるアプリということでしょうか?
でも、電卓アプリを紹介して欲しいという話ならカテ違いなのでは?

C/C++的に回答するなら、

float f=123.456;
unsigned char *p=(unsigned char *)&f;
printf("%02X %02X %02X %02X\n",p[0],p[1],p[2],p[3]);
とかで表示できるかと。ただし、エンディアンとかfloatのバイト数とか
環境依存なので、そのあたりは適当に調整してください。

QVBAで小数を16進数に変換

エクセル2003を使用しています。
A列に小数が入力されていて
B列に4バイトの16進数に変換した結果を出力するマクロを作りたいと考えています。
例えばA1=1.0のとき
B1=0000803F
とリトルエンディアンで表示させたいです。
エクセルでこのような変換は可能でしょうか?

Aベストアンサー

こんな感じでしょうか。Cのunionみたいな機能があれば良いのですが、無いので、ファイルに書いて読み直す。
Function ftox(f As Single) As String
Dim i As Long
Dim s As String
Open "C:\temp\xx" For Binary Access Write As 1
Put #1, , f
Close #1
Open "C:\temp\xx" For Binary Access Read As 1
Get #1, , i
Close #1
s = Hex(i)
ftox = Right(s, 2) & Mid(s, 5, 2) & Mid(s, 3, 2) & Left(s, 2)
End Function

別案としては、浮動小数点数値への変換ロジックをそのままVBAで書く。
めんどくさそうです。

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

Qバイト型のデータをLong型に変換

初歩的なことですみません。

Dim a(0 to 3) as Byte
Dim b as Long
と宣言します。
この変数aをLong型のbに変換するにはどのように
したらよいのでしょうか?
逆にbの値をaに変換する方法もできましたらお願いします。

Aベストアンサー

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
MoveMemory a(0), b, 4
MoveMemory b, a(0), 4

--
(2)が手堅く応用が利くかと。
(3)はlongならいいが、4の倍数でない型は問題あるかも。

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (D...続きを読む

QVisual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください

string(9)のエリア"Aa1アあa "の文字を1文字ずつASCII変換して、16進変換し、string(18)のエリアに格納します
すると"416131B182A08281202020"と変換されます
(一文字ずつ Hex(Asc(Buf))を使用しました)

逆に、"416131B182A08281202020"を"Aa1アあa "に戻したいのですが、
どのような関数を使えばよいのかわかりません。
困っています。教えてください。よろしくお願いいたします。

Aベストアンサー

VB既存の関数ではできないと思うので、自分で関数を作るなりしてください。

ヒントです。
ASC関数により変換された2バイト文字(シフトJIS)の1バイト目は81~9FおよびE0~FC(すべて16進)になります。
16進数から10進数に戻すには、頭に"&H"をつけます。(&H82A0 = 「あ」のシフトJISコード)
文字を数字に変換するのはVal関数、数字(文字コード)から文字に変換するのはChr関数です。

QVBAで符号無し整数

BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。
BMPファイルの構造は
http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html

のページに書かれてあるのですが、
typedef unsigned short WORD
typedef unsigned long DWORD
typedef unsigned char BYTE
typedef long LONG

などの「符号無し整数」で定義された変数を使う必要があります。


http://homepage1.nifty.com/rucio/main/kiso/DataType.htm

のページにあるようにVBではUlongやUshortが使えるようなのですが、

VBA上で

Dim bfSize As ULong


とすると、「ユーザー定義型は定義されていません」
と表示されます。

参照設定のところで何か設定を行えば良いと思うのですがどこを設定すれば良いのでしょうか?


もし、使えないとして、VBAで2バイトや4バイトを数値として読み込むにはどうすれば良いでしょうか?

BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。
BMPファイルの構造は
http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html

のページに書かれてあるのですが、
typedef unsigned short WORD
typedef unsigned long DWORD
typedef unsigned char BYTE
typedef long LONG

などの「符号無し整数」で定義された変数を使う必要があります。


http://homepage1.nifty.com/rucio/main/kiso/DataType.htm

のページにあるようにVBではUlongやUshor...続きを読む

Aベストアンサー

http://support.microsoft.com/kb/189323/ja

参考にしてみてください。

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

QVBAのバイナリ出力について

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #numff

temp = Range("C3")
Print #numff, temp

Close #numff

End Sub

(Sheet1のセルのC3に512文字入っています。)

これをOutputをBinaryにして・・・Putで書く?
多分2文字を取り出して・・・書き込む?ような感じなのですが
それをプログラムに起こす書き方がわからず困っています。

申し訳ございませんが、ご教授よろしくお願いします。。。

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #num...続きを読む

Aベストアンサー

akichan1jp さん
こんにちは。
次のプログラムでできると思います。

Sub test()
 TEMP = Worksheets("Sheet1").Range("C3")
 ReDim BIN(Len(TEMP) / 2 - 1) As Byte
 For I = 1 To Len(TEMP) Step 2
   BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
 Next I
 Open "1.BIN" For Binary As #1
 Put #1, , BIN
 Close #1
End Sub

注)"1.BIN"は事前に削除した方が安全です。
  例えばファイルの大きさが小さくなると、前のファイルの大きさがに維持されてしまいます。
  ご注意ください。

ご確認下さい。

Q16進数を2進数に変換するコードを知りたい

16進数を2進数に変換するコードをselect caseを用いて作りました。
しかし、遅いです。
場合分けの考え方を利用して、例えば変数がFだったら・・みたいな感じで16個のcase全てを書いてみたのですが、もし他にもっと早く処理する方法が合ったら教えてください。
また、データ型はこれが最良でしょうか??

データ型
変数1、2 使用文字:相当長い文字列のためstring
変数3   使用文字:1-0,A-F,及び0000-1111:string
変数4、5 使用文字:1-1,000,000程度:integer

Aベストアンサー

変数 x : 元の1桁の16進数に相当する数値(0~15)

str$((x and 8)>>3) & str$((x and 4)>>2) & str$((x and 2)>>1) & str$(x and 1)


v : 1桁の16進数文字列
x = CInt("&H" & v)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング