利用規約の変更について

12バイトのHEX文字列(FFFFFFFFFFFFFFFFFFFFFFFF)などを
をいったん、10進に変換し、DOUBLE型の変数に設定し、
数値演算を行い
再度HEX文字列(FFFFFFFFFFFFFFFFFFFFFFFF)に変換を行いたいのですが、
変換の方法がわからず困っています。
HEX関数はLONGでしかおこなえないようで・・

すみませんが、ご教授いただけると助かります。
宜しくお願いいたします。

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

A 回答 (4件)

変換規則さえ書かれていないので回答不能です。

    • good
    • 0

 DOUBLE FLOATINGは16進数に変換しても意味ないですよ。


 64ビットで暗号化されて(パック化?)入っていますので。
 参照URLをご覧下さい。(英語で御免ね。IEEE{アイトリプルイー}754)

参考URL:http://en.wikipedia.org/wiki/Double-precision_fl …
    • good
    • 0

double型でも12バイト(96ビット)の整数を完全に代入することはできないし、逆変換すると下位ビットが0になってしまうこともあると思うのですが、それはいいのでしょうか?



http://msdn.microsoft.com/ja-jp/library/vstudio/ …
によると、Double型は64ビットです。
そのうち、指数とか符号とかに一部が使われるので、整数型に換算すると 53bitしかありません。
http://ja.wikipedia.org/wiki/IEEE_754
    • good
    • 0

16進数の原理はご存知ですよね?


だったらできるんじゃないですか?

Function 十進変換(ByVal ヘキサ As String) As Double
Dim 位置 As Long
Dim 符号 As Long
Dim 数値 As Long
Dim 結果 As Double
'12文字限定
For 位置 = 1 To 12
  '位置の示す文字を数値化する
  数値 = Val("&H" & Mid(ヘキサ, 位置, 1))
  '先頭の場合は符号を設定する
  If 位置 = 1 Then
    If 数値 > 7 Then 符号 = 15
  End If
  '結果に加算する
  結果 = 結果 * 16 + (数値 Xor 符号)
Next
If 符号 Then 結果 = -結果 - 1
'結果を返す
十進変換 = 結果
End Function

16進への変換も同じです
Function 十六進変換(ByVal 数値 As Double) As String
Dim 位置 As Long
Dim 符号 As Long
Dim 繰越 As Long
Dim 剰余 As Long
Dim 結果 As String
'数値がマイナスならば正にする
If 数値 < 0 Then
  数値 = -数値
  符号 = 15
  繰越 = 1
End If
'12文字限定
For 位置 = 1 To 12
  '16で割った剰余を求める
  剰余 = 数値 - Fix(数値 / 16) * 16
  '数値を更新する
  数値 = Fix(数値 / 16)
  '負の場合は反転して繰越を加算する
  If 符号 Then
    剰余 = (剰余 Xor 符号) + 繰越
    '15を越えたら繰り越す
    If 剰余 > 15 Then
      剰余 = 0
      繰越 = 1
    Else
      繰越 = 0
    End If
  End If
  '文字化して前方に付け加える
  結果 = Hex(剰余) & 結果
Next
'結果を返す
十六進変換 = 結果
End Function
    • good
    • 0

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

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

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

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

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

Q数値を浮動小数点32bitHEXコードに変換

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

Aベストアンサー

環境が不明ですが、.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で変数をバイト配列化することができます。こちらのコードは割愛。必要なら補足出してください。

環境が不明ですが、.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 = ""

' リトルエンディアンならバイト配列を...続きを読む

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進数への変換はよく分かりません。

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で符号無し整数

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

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

Q2進数と16進数の相互変換

VBScriptで
2進数と16進数の相互変換をしたいのですが、
進数を変換する関数としては、
Hex関数やOct関数ぐらいしか見当たりません。
どうしたらいいのでしょうか?
よろしくお願いします。

Aベストアンサー

無ければ作るまでです。

Dim MyBin, MyHex
MyBin = Hex2Bin("FF")
WScript.Echo MyBin
MyHex = Bin2Hex(MyBin)
WScript.Echo MyHex

Function Hex2Bin(Hex)
Dim Dec
Dec = CInt("&H" + Hex)
Hex2Bin = Dec2Bin(Dec)
End Function

Function Bin2Hex(Bin)
Dim Dec
Dec = Bin2Dec(Bin)
Bin2Hex = Hex(Dec)
End Function

Function Dec2Bin(ByVal Dec)
Do
Dec2Bin = CStr(Dec Mod 2) & Dec2Bin
Dec = Dec \ 2
Loop Until Dec = 0
End Function

Function Bin2Dec(Bin)
For i=1 To Len(Bin)
Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin,i,1))
Next
End Function

無ければ作るまでです。

Dim MyBin, MyHex
MyBin = Hex2Bin("FF")
WScript.Echo MyBin
MyHex = Bin2Hex(MyBin)
WScript.Echo MyHex

Function Hex2Bin(Hex)
Dim Dec
Dec = CInt("&H" + Hex)
Hex2Bin = Dec2Bin(Dec)
End Function

Function Bin2Hex(Bin)
Dim Dec
Dec = Bin2Dec(Bin)
Bin2Hex = Hex(Dec)
End Function

Function Dec2Bin(ByVal Dec)
Do
Dec2Bin = CStr(Dec Mod 2) & Dec2Bin
Dec = Dec \ 2
Loop Until Dec = 0
End Function

Function Bin2Dec(Bin)
For i=1 To Len(B...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

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進数の変換処理

VisualBasic6.0で
Val("&H" & "F")
を実行すると、15

Val("&H" & "FF")
を実行すると、255

Val("&H" & "FFF")
を実行すると、4095

Val("&H" & "FFFF")
を実行すると、-1

Val("&H" & "FFFFF")
を実行すると、1048575

という結果が得られます。

なぜ”FFFF”の時に”-1”が返ってくるのでしょうか?
また、どうやったら、
”FFFF”から”65535”が得られるのでしょうか?

教えてください。
よろしくお願いします。

Aベストアンサー

VAL関数
指定した文字列に含まれる数値を適切なデータ型に変換して返します。

FFFFは、INT型で扱える最大値なのでINT型と判定されます。
cint("&H"+"FFFF")だと、-1が返ります。
FFFFFは、INTの扱える値を超えたのでLONG型で判定される為に1048575と言う結果になるのです。
では、なぜマイナスになるのか?
FFFFを2進数で表すと以下のようになりますね。
11111111 11111111 11111111 11111111
↑先頭の1バイト目が1だとマイナスとして扱われます。

以上です。

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

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...続きを読む


人気Q&Aランキング

おすすめ情報