排他的論理の計算をするには?

解決


ド素人  2006-06-23 01:27:09  No: 131987

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

このような値を取得するにはどのようにすればいいのでしょうか?
どなたか教えてくださいお願いします。


GOD  2006-06-23 02:23:59  No: 131988

Xor 演算子を使用すればいいのでは。

法則が良く分からないけど...
R → 52H これが 32 ? Hex(Hex(Asc("R"))) でも合わない。
5 → 35H これが 23 ? Hex(Hex(Asc("5"))) なら合いそう。
でも、もし"Z"とかならどうするんだろう。
Z → 5AH これは何に変換?


ド素人  2006-06-23 02:35:01  No: 131989

失礼しました。
形としては"R→ASCII→16進数→Xor"
としたいのですが・・・


GOD  2006-06-23 02:46:40  No: 131990

これでどう?
Hex(Asc("R") Xor Asc("5") Xor Asc("6") Xor Asc("7") Xor Asc("2"))


ド素人  2006-06-23 02:57:35  No: 131991

実は"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


GOD  2006-06-23 04:35:59  No: 131992

こんな感じじゃないですか?

    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が入っているとエラーでそうですね。)


ド素人  2006-06-23 19:02:32  No: 131993

どうしても上手くいかないのでプログラムを載せます。
因みに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


GOD  2006-06-23 19:45:16  No: 131994

処理がめちゃくちゃになっているので、整理しながら作り直したらどうでしょう。

>因みに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が返ってきそう)


ド素人  2006-06-23 20:16:04  No: 131995

かなり勘違いしてました。排他的出来ました。

If Text10.Text > 4000 Then
    MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "

        ↑
このプログラムだと500をテキストに入れると
MsgBox "範囲以上の数値が入力されました。", MB_ICONEXCLAMATION, "
が成立するのですか?


GOD  2006-06-23 20:54:43  No: 131996

>このプログラムだと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
'----------------------------------------------


ド素人  2006-06-24 00:54:17  No: 131997

ありがとうございます。
解決出来ました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加