關於 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"
求助高手 釐清觀念 應該是手冊寫錯了
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
回复 2# Duvet
學習了感謝 幫忙^^ 本帖最后由 netegg 于 2011-12-13 21:50 编辑
具体的没细算,异或的问题拆开来想应该不难,0变1,1变0,几个数二进制处理后,只要该位有1则结果为1,否则为0大概是这样吧 异或在处理里面是最简单了,同一个数编码和解码就行了,
页:
[1]