kk_lee69 发表于 2011-12-12 20:56:02

關於 BitXOR 運算問題...無法整理出運算邏輯....求助高手

本帖最后由 kk_lee69 于 2011-12-12 22:01 编辑

小弟有個問題 想求助各位高手......幫忙協助小弟整理出 程式的運算語法.....問題如下:
這是考勤機的溝通程式.........
已知兩個字串分別為..... 這是封包要傳送的內容
$A="0100"
$B="0120"

根據考勤機 的封包定義 .......如下:
封包頭 + 傳送內容+檢查碼+封包尾

封包頭 固定為 0x02

封包尾 固定為 0x0D跟 0x0A

檢查碼運算規則: ID到Command或Data區每一個byte做XOR(互斥)後的結果。





問題來了根據上面資料 我應該傳送 0x0230313030310D0A理論上可以跟機器溝通.....但是 實際上不是....實際上我必須傳送 0x0230313030010D0A才可以跟機器溝通....

字串 A經過 StringToBinary("0100") 這個運算可以得到 0x30313030這個是一部分的資料
而 字串A 經過 BitXOR(0,1,0,0) 的運算 可以的到 1其實這個就是 正確碼的 01 部分只是不知道為何 手冊上 會再把這個1 轉換成 0x31這是部分我懷疑是手冊寫錯??還是我不懂...我實在不解....
先假設我的想法沒錯 所以以字串A 來說整個封包格式 就等於0x02   + 0x30313030   +0x01 +0x0D+0x0A老實說 這邊我實在不知道怎麼做運算得到 0x0230313030010D0A 的結果....

而字串 B 的檢查碼BitXOR(0,1,2,0)得到的結果 是 3   但是我不懂 這個3 是數字呢還是 0x03 ... 我只能得到 一個3

求解:
我想把上面的情況 寫成一小段程式可以 直接 運算出我最後想得到的結果
把 A字串的變成 "0x0230313030010D0A"   把 B字串變成"0x0230313230030D0A"   

求助高手 釐清觀念

Duvet 发表于 2011-12-13 18:35:30

應該是手冊寫錯了

0x02 + 0x30313030 + 0x01 + 0x0D + 0x0A
這邊不能用+來表示,會變成16進制的運算
應該是二進制下的串接
MsgBox(0, "Result", Binary("0x02") & Binary("0x30313030") & Binary("0x01") & Binary("0x0D") & Binary("0x0A"))

BitXOR(0,1,2,0) 返回結果是十進制數字3
0x03 是16進制表示法,需用Hex函數再轉換一次


MsgBox(0, "Result", _Test("0100") & @CRLF & _Test("0120"))
Exit

Func _Test($DATA)
        Return SetError(0, 1, "0x02" & StringTrimLeft(StringToBinary($DATA), 2) & _XORChecksum($DATA) & "0D0A")
EndFunc

Func _XORChecksum($Text)
        Local $CheckCode = 0
        While $Text <> ""
                $CheckCode = BitXOR(StringToBinary(StringLeft($Text, 1)), $CheckCode)
                $Text = StringTrimLeft($Text, 1)
        WEnd
        Return SetError(0, 0, Hex($CheckCode, 2))
EndFunc

kk_lee69 发表于 2011-12-13 21:36:09

回复 2# Duvet

學習了感謝 幫忙^^

netegg 发表于 2011-12-13 21:47:41

本帖最后由 netegg 于 2011-12-13 21:50 编辑

具体的没细算,异或的问题拆开来想应该不难,0变1,1变0,几个数二进制处理后,只要该位有1则结果为1,否则为0大概是这样吧

asdasdasd 发表于 2011-12-14 17:31:39

异或在处理里面是最简单了,同一个数编码和解码就行了,
页: [1]
查看完整版本: 關於 BitXOR 運算問題...無法整理出運算邏輯....求助高手