2015-04-02 45 views
2

我打算通過socket發送一個字節數組,但我曾經在c/C++中工作過,並且對lua來說是新的。 現在我有一個問題,這是我的問題。在lua中將字符串轉換爲十六進制?

我想發送一個bytearray.It應該包含mac_address,string_length,string。

對於細節:

MAC_ADDRESS:6個字節 長度字符串的:1個字節 字符串:若干字節

(1)第一個問題 現在,我有MAC_ADDRESS的像「01的字符串:2F :c2:5e:b6:a3「,我怎麼把它轉換成一個6字節的十六進制數組?

(2)秒 如何定義一個無符號數並將其存儲爲字節?例如,sting_length爲33,如何將它作爲0x21存儲到一個字節中?

(3)last 如何將mac_address(6bits),string_length(1bit),data_string(例如100bytes)組合成一個字節數組,並通過luasocket成功發送出去。

就是這樣。

謝謝!

回答

2

您可以使用string.char來獲取數字的符號表示形式,這將允許您將數字打包爲字節。像這樣的東西應該工作:

local function packet(address, str) 
    return address:gsub("(%x+):?",function(s) return string.char(tonumber(s, 16)) end) 
    .. string.char(#str) 
    .. str 
end 

print(packet("10:2f:c2:5e:b6:a3", "abc") == "\16/\194^\182\163\3abc") 

gsub利用每一個組中的地址,tonumber(s, 16)十六進制數轉換成十進制和string.char其轉換成一個字符(一個字節)表示。然後將它們一起打包成一個可以發送的字符串。這是結果字符串的Lua表示形式:"\16/\194^\182\163\3abc"

+0

您應該使用'%x'而不是'%w' – hjpotter92 2015-04-03 07:40:19

+0

正確;更新。謝謝。 – 2015-04-03 15:21:54

0
function hexbyte(a,b) 
b1=string.byte(a) 
b2=string.byte(b) 
result = 0 
    if (b1 >= string.byte('A')) then 
    result = 16*result + b1 - string.byte('A') +10 
      else 
    result = 16*result + b1 - string.byte('0') 
    end 

    if (b2 >= string.byte('A')) then 
    result = 16*result + b2 - string.byte('A') +10 
    else 
    result = 16* result + b2 - string.byte('0') 
end 
return string.format('%02X', (result)) 
end 
+0

請提供您的代碼的解釋。 – OldMcDonald 2016-08-10 12:00:53

+0

它需要兩個章程,例如'C'和'3'並返回十六進制C3。 另外,如果你需要0xC3的小數,那麼你可以簡單地做 返回結果 – 2016-08-11 07:40:19

相關問題