2015-12-07 114 views
1

我一直試圖根據文件頭產生校驗和,並且收到衝突的結果。在從設備手冊,它指出以下,以產生校驗:奇校驗和結果 - 沒有收到預期的結果

「一個簡單的八比特計算被用於報頭校驗是所需的步驟如下:

  1. 計算的總和單個字節中的標題字節;或者計算 的總和,然後將結果與FFhex相加
  2. 校驗和= FFhex - 來自步驟1的和。

在這裏,我已經創建了下面的代碼在Lua:

function header_checksum(string) 
    local sum = 0 
    for i = 1, #string do 
     sum = sum + string.byte(i) 
    end 
    local chksum = 255 - (sum & 255) 
    return chksum 
end 

如果我下面的(4X字節)發送一串下來print(header_checksum("0181B81800"))我得到以下結果:

  • 241(字符串發送,因爲你看到它)
  • 0(每個字節更改爲十六進制,然後發送到功能)

在給出的示例中,它指出該字節應爲AD,即173(dec)或\ 255。

有人可以告訴我我在做什麼是錯的;要麼寫的代碼,我的方法,或兩者​​?

+0

使用'字符串:字節(我)',而不是'string.byte(我)' –

+0

這裏的樣式尼特是,你命名的參數'string'這也是一個標準模塊的名稱,具體該模塊是所有字符串的元數據,通常在'_G.string'中找到。重載這個名字是完全合法的Lua,但是它是人們讀者習慣於看到'string.byte()'用於直接引用該函數的一個混淆之處。 – RBerteig

+0

@RBerteig好點。我很容易混淆,尤其是當涉及到bit32庫以及如何正確使用它時。我應該停止讓事情變得更糟。您的觀點是爲未來的編碼注意的! – Pwrcdr87

回答

2
function header_checksum(header) 
    local sum = -1 
    for i = 1, #header do 
     sum = sum - header:byte(i) 
    end 
    return sum % 256 
end 

print(header_checksum(string.char(0x01,0x81,0xB8,0x18,0x00))) --> 173 
+0

ahhh ....冒號...感謝Egor! – Pwrcdr87