初めて質問します。今、大学生で卒業研究しているのですが外部の機械からサンプリング(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を使っています。簡単なことかもしれませんが、今月中に、この後もまだまだしなくてはいけないのでお願いします。文章も苦手なもので、わからないことがあるかもしれませんがその時は言ってください。

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

A 回答 (4件)

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



比の定義が定まったら、#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
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。一応できたのですが、上のやり方ではまだ出来てませんので今から試してみようと思います。

お礼日時:2002/01/07 19:58

文系人間で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と出ます。さて
こんなものでいいのでしょうか。全く見当はずれでないか
心配ですが、その時は笑って許してください。
    • good
    • 0

よく理解していませんが・・・



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


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

それが定まれば、あとは比率で算出できると思います
    • good
    • 0

VB の環境がないので、記憶にたよって書きます。


誤りがあるかも知れません。
16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、

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

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

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

ありがとうございます。出来るかどうかまだ試していませんが、今からやってみます。

お礼日時:2002/01/07 06:08

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

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

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

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

Q8進数から16進数への変換

8進数から16進数、また、16進数から8進数に
計算過程でほかの進数に変換することなく直接変換できますか?

Aベストアンサー

例:
8進の 324 を16進に。
32 と 4に分ける
32 を 2で割る → 15 あまり 0
あまり0なので、4はそのまま。
15を1 5 に分ける。
1を2で割る→ 0 あまり 1
あまり1なので、 5に+8する
0になったので終了。 答えは D4

等というように、ビットシフトと等価な計算はできます。
ただ、これを「他の進数に変換していない」と言っていいか微妙です。

それに、2進数にして区切りを変更する方が楽なのではないでしょうか。
324 → 011 010 100 → 0 1101 0100 → D4

Q1バイト文字の上位4ビット・下位4ビットの入れ替え方法を教えて下さい

あるパスワードをテキストファイルに書き込む処理です。
そのままだと、パスワードの意味が無いので、上位4ビットと下位4ビットを入れ替えて保存しようと思います。
上位・下位それぞれ4ビットシフトするところまでは出来ました。

 Dim a As Integer
 Dim a1 As Integer
 Dim a2 As Integer
 a = Asc("a")
 a1 = a \ 2 ^ 4
 a2 = a * 2 ^ 4
 MsgBox (Hex(a1))
 MsgBox (Hex(a2))

が、それを8ビットに戻す方法が分かりません。
また、パスワードは1バイト文字による文字列ですが、文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません。
以前、MS-C(MSDOS上のC言語)を少しやったので、それでなら分かるのですが、VBは全くの初心者で、調べても調べても見当がつきません。
どうか教えて下さい。
宜しくお願い致します。

Aベストアンサー

●1バイト文字の上位4ビット・下位4ビットの入れ替え
参考。理解・確認のため余分なものを入れている。
骨子は*****のところ。
Sub test01()
h = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", _
"9", "A", "B", "C", "D", "E", "F")
a = Asc("z")
MsgBox "コード" & a
x = a Mod 16 '*****
y = Int(a / 16) '*****
MsgBox "16進表示" & h(x) & " " & h(y)
'もとの数のビット列
s = ""
x = a
For i = 1 To 8
y = x Mod 2
s = y & s
x = Int(x / 2)
Next i
MsgBox "もとの数のビット列" & s
'----
'上位・下位4ビット反転
x = a Mod 16
y = Int(a / 16)
z = x * 16 + y '*****
MsgBox "上位・下位4ビット反転のコード" & z
x = z Mod 16
y = Int(z / 16)
MsgBox "16進表示" & h(x) & " " & h(y)
'------上位・下位4ビット反転のビット列
s = ""
x = z
For i = 1 To 8
y = x Mod 2
s = y & s
x = Int(x / 2)
Next i
MsgBox "上位・下位4ビット反転" & s
End Sub
●文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません
上記でもやってますが、
S=""
For i=1 to 文字列長
Xには1バイト分上位・下位4ビット反転した結果を入れる
S=S & X
Next i
を使えば良いです。
下位桁から処理なら
S= X & S
にする。

●1バイト文字の上位4ビット・下位4ビットの入れ替え
参考。理解・確認のため余分なものを入れている。
骨子は*****のところ。
Sub test01()
h = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", _
"9", "A", "B", "C", "D", "E", "F")
a = Asc("z")
MsgBox "コード" & a
x = a Mod 16 '*****
y = Int(a / 16) '*****
MsgBox "16進表示" & h(x) & " " & h(y)
'もとの数のビット列
s = ""
x = a
For i = 1 To 8
y = x Mod 2
s = y & s
x = Int(x / 2)
Next i
MsgBo...続きを読む

Q2進数から16進数への変換、あるいはその逆について

はじめまして。
高校の情報の授業で「2進数・10進数・16進数」を勉強しています。
どうしても2進数から16進数への変換、あるいは、16進数から2進数への変換の方法がわかりません・・・

初心者でも分かりやすい解説をお願いします。

Aベストアンサー

2進数の各桁を、右から4桁毎に区切って、その4桁を右から1,2,4,8という具合に割り当てます。
その4桁を、16進数の1文字に対応させて、そのまま置き換えるだけです。
これを、2進数の4桁毎に、繰り返せば複数桁の16進数になります。

逆に、16進数を2進数にする場合は、16進数を1桁ずつに分解し、それぞれを2進数4桁に置き換えて、全体を繋げれば完成です。

2進数:16進数:中身
0000=0=0そのまま
0001=1=1そのまま
0010=2=2そのまま
0011=3=2+1
0100=4=4そのまま
0101=5=4+1
0110=6=4+2
0111=7=4+2+1
1000=8=8そのまま
1001=9=8+1
1010=10=8+2
1011=11=8+2+1
1100=12=8+4
1101=13=8+4+1
1110=14=8+4+2
1111=15=8+4+2+1

QMidとMid$の使い分け

MidとMid$の使い分けについて教えてください。

http://www.tsware.jp/labo/labo_32.htm

このページにあるように
$が付いた関数は文字列型の値を返し、付いていないものはバリアント型の値を返す、あります。

つまり、出力先が
数値と文字列が混在した配列(つまりvariant型)のみに$無しを用いて、
それ以外の場合には$有りを用いるということでしょうか?
合っていますか?

Aベストアンサー

#4の回答者です。

あくまでも、#4で書いたのは、現在の個人的意見で、結論的なことを言うつもりはありません。

>将来的にVBAやVBで使えなくなる可能性があるので
>Midを使った方が良い。

ずっと前に、VB.Net やC#に移行するという話があって、移行しやすいようにと考えて、いわゆる「忖度(そんたく)」して方針を合わせたつもりだったのですが、ここ数年、そういう事自体があやふやになってきたように思います。

>ただ、Midの仕様は時代遅れなものであり、(Variant型出力)
これは確かですが、

>本来はMid$が生き残るべきである。   (String型出力)
もう、これは、VB.Net では決まっていることですから、私たちがとやかく言っても始まりませんね。

論理的には、文字列を扱うのだから、出力自体は、String型でもよいのではないかとは思います。VB6系からVB.Net を後継とするべきではないかもしれませんが、VB.Netでの、同様の関数は、文字列(String型)の出力です。

私は、最初のリンク先のT's ware の内容は、速い・遅いだけの話には違いないのですが、人によっては、短絡的に「速い方がよい」という括りで価値観を決めてしまうことになりかねないと思います。

最近の話ですが、コンマ何秒の速さだけを求めることには、私は疑問に感ずることが多いです。そんなことを書いたら、相手の人は、1万回以上もループしているのだから当たり前だ、といわんばかりでした。そんな話は少しも聞いていないよ、というところですが、そういう場合は、コードは速いほうに越したことはない……、それはごもっともです。

しかし、そんな必要もない人、言い換えれば、そのような負担がない状況下では、その内部的な仕様がどうであれ、記述自体は、ノーマルなMid関数のままでもよいのでは、と考えるのです。こういう考え方を書くと、曖昧さがあるから、苛立つ人もいます。私は、どっちにしろとは、他人に対しても、自分に対しても使い分けろなんていうつもりはありません。ただ、$付き、$なし、どちらを書いても、そんなに困るものではないと思うのです。

本当の意味での、私たちの将来などは分からないけれど、今を最高のチューンしたものに仕上げると、返って、動きの取れないものになることも多いような気がします。

#4の回答者です。

あくまでも、#4で書いたのは、現在の個人的意見で、結論的なことを言うつもりはありません。

>将来的にVBAやVBで使えなくなる可能性があるので
>Midを使った方が良い。

ずっと前に、VB.Net やC#に移行するという話があって、移行しやすいようにと考えて、いわゆる「忖度(そんたく)」して方針を合わせたつもりだったのですが、ここ数年、そういう事自体があやふやになってきたように思います。

>ただ、Midの仕様は時代遅れなものであり、(Variant型出力)
これは確かですが、

...続きを読む

Q8桁文字列を16進数バイト配列に変換

お世話になります。
VB2005を使用しています。
温調器から温度データを引っ張るプログラムを作成しています。
8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。
8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか?
文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか?
よろしくお願い致します。

Aベストアンサー

その温度計のメーカーには問い合わせしたのでしょうか
サンプルとかはないのですか

たとえば "GET" といった文字列を送りたい場合
どのように変換したものを送ればいいのかなど

"GET" を "474554"といった文字列に変換して送信なのか
『474554』といった文字列が必要なら

dim bld as new System.Text.StringBuilder
dim ss as string
for each _byte as Byte in AryByte
  bld.Append( String.Format( "{0:X2}", _byte ) )
next
ss = build.ToString
SerialPort1.Write( ss, 0, ss.length )
といった具合でよさそうですが

メーカのWebページなどにその機器の使い方のサンプルがあるなら
明示してみるといいかもしれませんよ

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

QHEX

HEXで'0x1E','0x1D''0x00'
をそれぞれ文字型に1字で入れたいのですがどういう記述をすればよいのでしょうか。

Aベストアンサー

参考までに補足です。
>Visual BASIC にはその機能がないため少々困難です。
キャストできますよ。

バイト配列にセットしてあげれば、VBでも操作可能です。。。

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ファイル内の(&H0A)を(&H0D0A)に変換したい

改行コードが0A(16進数)となってしまっているファイルを
0D0A(16進数)に変換したいのですが、どのような方法がありますか?
出来れば時間の掛からない方法が知りたいです。

ファイルは、ヤマト運輸の着店コードファイルで件数が3000件ほどあるのですが
改行コードが0AなのでInput#で読み込めません。

ファイルを変更しなくても良い方法があればそれでも結構です。

Aベストアンサー

置き換えてファイルの保存をしたかったのですね・・・

それと、やはり読み込まない事には、置き換えれないですよ。
だって読んでないんだもん・・・


んで、置き換えで保存するのに一番早いのは#2に書いてあるようにまず
「GETで読む」
「Replace関数で置き換える」← 一度でファイル内の文字列を変換できます(VB6仕様)
「PUTでファイルに落とす」
これをファイルの数だけ繰り返す処理になると思います。

大まかにわけると、たった3つの処理で済みます。


人気Q&Aランキング

おすすめ情報