OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

VB初心者ですが教えてください。16進数→10進数に変えるやり方。

  • すぐに回答を!
  • 質問No.193737
  • 閲覧数1544
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 50% (2/4)

初めて質問します。今、大学生で卒業研究しているのですが外部の機械からサンプリング(A/D変換)するという簡単なものなのです。A/D変換は2チャンネル使っています。その二つのデータが、16進数の4バイトで出しています。上位2バイトがチャンネル2、下位2バイトがチャンネル1になっています。16進数8000hが0V、FFFFhを10V、0000hを-10Vとしたいのですがどうすればいいかわかりません。
例えば8003C000hと出たとき8003が約0V、C000が約5Vとなるようにしたいのです。

Data1=Mid(Hex(SmplData(0,0)),5,4) '下位2バイトチャンネル1のデータ
Data2=Mid(Hex(SmplData(1,0)),1,4) '上位2バイトチャンネル2のデータ

これを上で書いたように変えたいのです。教えてください。使っているA/D変換機はインターフェイスのPCI-3178を使っています。簡単なことかもしれませんが、今月中に、この後もまだまだしなくてはいけないのでお願いします。文章も苦手なもので、わからないことがあるかもしれませんがその時は言ってください。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

とりあえずさっきの発言についての補足です。

比の定義が定まったら、#1のtailkuppaさんの発言を参考に行うと、できると思います。



さらにtailkuppaさんの発言についての補足です。

>16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
たしかに、その通りだとおもいます。

>ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、
この処理はあまりお勧めしません。。。
いくつ以上の時・・・
いくつ以下の時・・・
と処理を分けるのではなく、符号無しへの変換をするようにしましょう。
符号無し定数とビット単位での比較を行う事により、符号ありから符号無しへの16進数へ変換が可能です。

Sub main()
  Const LNG_FFFF As Long = &HFFFF&'変換定数
  
  Dim lngWork As Long
  
  '取り敢えず値代入
  lngWork = &HFFF0
  
  '出力
  Debug.Print lngWork         '-16 (符号ありの状態なので、負の値)
  Debug.Print (lngWork And LNG_FFFF) '65520(符号なしの状態なので、正の値)
End Sub
お礼コメント
lukky-cope

お礼率 50% (2/4)

丁寧な説明ありがとうございます。一応できたのですが、上のやり方ではまだ出来てませんので今から試してみようと思います。
投稿日時 - 2002-01-07 19:58:49
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 53% (52/98)

VB の環境がないので、記憶にたよって書きます。 誤りがあるかも知れません。 16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。 ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、 Voltage1 As Double '←適当な型にしてやってください Vol ...続きを読む
VB の環境がないので、記憶にたよって書きます。
誤りがあるかも知れません。
16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、

Voltage1 As Double '←適当な型にしてやってください
Voltage1 = (Val("&H" & Data1) + 32768) / 65536 * 20 - 10

のようにすれば、V 数に変換できると思います。

A/D 変換などについては全く分からないので自信はないのですが、単純に質問文に沿って数値の変換をするだけであれば、こんな感じだと思います。
頑張ってください。
お礼コメント
lukky-cope

お礼率 50% (2/4)

ありがとうございます。出来るかどうかまだ試していませんが、今からやってみます。
投稿日時 - 2002-01-07 06:08:14


  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

よく理解していませんが・・・ 例で上げられている (1)&HFFFF& = 65535 → 10V (2)&H8000& = 32768 → 0V (3)&H0000& = 0 → -10V は、正確な例では無いように思えます。 (2)-(1)=65535 - 32768 = 32767 (3)-(2)=32768 - 0 = 3 ...続きを読む
よく理解していませんが・・・

例で上げられている
(1)&HFFFF& = 65535 → 10V
(2)&H8000& = 32768 → 0V
(3)&H0000& = 0 → -10V
は、正確な例では無いように思えます。


(2)-(1)=65535 - 32768 = 32767
(3)-(2)=32768 - 0 = 32768
となり、10Vの等差になりません。

それが定まれば、あとは比率で算出できると思います
  • 回答No.4
レベル14

ベストアンサー率 28% (4322/15243)

文系人間でA/D変換など詳しく分からない者です。 16進数を10進数に変換する私の使うロジックを下記に書きます。 8バイトの文字(0からFのどれか)で2+2=4バイトを表しているとします。ファイルの中でA~Fが小文字のときはa~fに変えてください。 Private Sub Form_Click() Dim s, x, y As String Dim tbl As String Dim w(5) ...続きを読む
文系人間でA/D変換など詳しく分からない者です。
16進数を10進数に変換する私の使うロジックを下記に書きます。
8バイトの文字(0からFのどれか)で2+2=4バイトを表しているとします。ファイルの中でA~Fが小文字のときはa~fに変えてください。
Private Sub Form_Click()
Dim s, x, y As String
Dim tbl As String
Dim w(5) As Long
Dim u As Long
Dim v As Long
tbl = "0123456789ABCDEF"
s = "FAC33FA8"  '1例として設定
x = Mid$(s, 1, 4)
y = Mid$(s, 5, 4)
Form1.Print x, y
'-------
For i = 1 To 4
 w(i) = InStr(tbl, Mid$(x, i, 1)) - 1
 Form1.Print w(i)
Next i
'----
u = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print u
'--------
For i = 1 To 4
 w(i) = InStr(tbl, Mid$(y, i, 1)) - 1
 Form1.Print w(i)
Next i
'-----
v = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print v
End Sub
ここでuとvのそれぞれに付いて65536/20=3276で
20等分してint(u/3276)-10を計算すると65536は+10、
32768は0、0は-10と出ます。さて
こんなものでいいのでしょうか。全く見当はずれでないか
心配ですが、その時は笑って許してください。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ