找回密码
 加入
搜索
查看: 3147|回复: 4

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

  [复制链接]
发表于 2011-12-12 20:56:02 | 显示全部楼层 |阅读模式
本帖最后由 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"   

求助高手 釐清觀念

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 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

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

 楼主| 发表于 2011-12-13 21:36:09 | 显示全部楼层
回复 2# Duvet

學習了  感謝 幫忙^^
发表于 2011-12-13 21:47:41 | 显示全部楼层
本帖最后由 netegg 于 2011-12-13 21:50 编辑

具体的没细算,异或的问题拆开来想应该不难,0变1,1变0,几个数二进制处理后,只要该位有1则结果为1,否则为0大概是这样吧
发表于 2011-12-14 17:31:39 | 显示全部楼层
异或在处理里面是最简单了,同一个数编码和解码就行了,
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 03:29 , Processed in 0.076169 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表