Asc 関数を使ってASCIIコードを返し16進数に変換、1文字ごとビット変換しに
排他的論理和をとるというようなことをしたいんですが
どうしたらいいでしょうか?
例えば
data = "R5672"というようなデータがあるとき
ASCIIコード
R 52 32 0011 0010
5 35 23 0010 0011
6 36 24 0010 0100
7 37 25 0010 0101
2 32 20 0010 0000
EOR計算結果 0011 0000
16進変換 data2 = 3 0
このような値を取得するにはどのようにすればいいのでしょうか?
どなたか教えてくださいお願いします。
Xor 演算子を使用すればいいのでは。
法則が良く分からないけど...
R → 52H これが 32 ? Hex(Hex(Asc("R"))) でも合わない。
5 → 35H これが 23 ? Hex(Hex(Asc("5"))) なら合いそう。
でも、もし"Z"とかならどうするんだろう。
Z → 5AH これは何に変換?
失礼しました。
形としては"R→ASCII→16進数→Xor"
としたいのですが・・・
これでどう?
Hex(Asc("R") Xor Asc("5") Xor Asc("6") Xor Asc("7") Xor Asc("2"))
実は"R"じゃなくてTextデータなので何桁入るか分かりません。
過去ログを見て自分なりに作ってみたのですが、どうも上手くいかなくて・・・
Dim a As String
Dim b As Integer
Dim c As Integer
Dim d As String
Dim g As Integer
Dim i As Integer
a = Text1.Text
c = Hex(Asc(Left$(a, 1)))
g = c
Text6.Text = c
For i = 2 To Len(a)
b = Hex(Asc(Mid$(a, i, 1)))
g = g Xor b
Next i
d = Right$("0" & Hex$(g), 2)
Text2.Text = d
こんな感じじゃないですか?
Dim lngCount As Long
Dim lngData As Long
Text6.Text = Hex(Asc(Left(Text1.Text, 1)))
lngData = 0
For lngCount = 1 To Len(Text1.Text)
lngData = lngData Xor Asc(Mid(Text1.Text, lngCount, 1))
Next
Text2.Text = Right("0" & Hex(lngData), 2)
#HEXの戻り値は文字列ですよ。それを数字型に代入して変なことになってますね。(テキストボックスにZが入っているとエラーでそうですね。)
どうしても上手くいかないのでプログラムを載せます。
因みにIf Text10.Text > 4000 Thenも"500"を書き込むとエラーメッセージが
出ます・・・。
Private Sub Command12_Click()
Dim dai As String
Dim hen As String
If Text10.Text > 4000 Then
MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "エラーメッセージ"
Text10.Text = 4000
Else
dai = Text10.Text
hen = Right("000" & Hex(dai), 4)
Text20.Text = hen
End If
Dim Hedder As String
Dim Finscode As String
Dim MEM As String
Dim Start As String
Dim Youso As String
Dim FCS As String
Hedder = "@00FA000000000"
Finscode = "0102"
MEM = "82"
Start = "026E00"
FCS = Hedder & Finscode & MEM & Start & Youso & hen
Dim a As Long
Dim b As Long
Dim c As Long
Dim i As Long
FCS = c
a = Hex(Asc(Left(c, 1)))
b = 0
For i = 1 To Len(a)
b = b Xor Asc(Mid(a, i, 1))
Next i
Text21.Text = Right("0" & Hex(b), 2)
End Sub
処理がめちゃくちゃになっているので、整理しながら作り直したらどうでしょう。
>因みにIf Text10.Text > 4000 Thenも"500"を書き込むとエラーメッセージが
>出ます・・・。
>
これは良く分からないけど↓のようにやると False が返ってきてるはずですが
Debug.Print ("500" > 4000)
どんなエラーメッセージが出ます?
>FCS = Hedder & Finscode & MEM & Start & Youso & hen
したあとで
>FCS = c
になんの意味があるのか?
FCSは代入だけされて誰にも使用されていないけど。
Youso は代入されていないから必ず初期値("")ですね。
> Dim a As Long
> Dim c As Long
>
Long型になってますが、これは正しいの?
> a = Hex(Asc(Left(c, 1)))
>
cは誰にも代入されていないから0(数字)のはずだけどどんな意味があるの?
aは数値型なのに文字列入れようとしているし。
> Len(a)
>
これの狙いは何ですか?(Long型なのでVB6なら4、.Netなら8が返ってきそう)
かなり勘違いしてました。排他的出来ました。
If Text10.Text > 4000 Then
MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "
↑
このプログラムだと500をテキストに入れると
MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "
が成立するのですか?
>このプログラムだと500をテキストに入れると
>MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "
>が成立するのですか?
>
成立しないはずです。
但し、4000側も文字列である場合は成立します。(文字列の比較を行うので)
4000 は文字列型の変数と言うことはないですか?
例.
'----------------------------------------------
Dim strMax As String
strMax = 4000
If CLng(Text10.Text) > strMax Then
'----------------------------------------------
それなら数値型にして比較して下さい。
'----------------------------------------------
Dim strMax As String
strMax = 4000
If CLng(Text10.Text) > CLng(strMax) Then
'----------------------------------------------
ありがとうございます。
解決出来ました。
ツイート | ![]() |