在EC机器人的lua程序中,例如通过socket或者485接受数据,可以接受纯字符串例如“1.234”这种,
也可以接受16进制的数据,但会将接收到的数据以对应字符串形式接受,例如原始数据0x3F800000(浮点数表示为1.0),
则使用Ret ,recv=client_recv_data(ip ,2,1)指令(指令中的2表示超时时间,1表示接受的是16进制数据)接受到的是"0000803F"(低字节在前)。
可以使用以下代码,将16进制数据的字符串转为对应浮点数和带符号整数。 注意原始数据的高低字节。
-- author: chenliao@elibot.cn -- Mar.15, 2023 function Dint2StrHex(data,BigEndian) -- 输入32位的带符号整数,输出转为16进制数据的字符串形式 -- 默认小端编码,若要使用大端编码,使用BigEndian out = string.pack('i',data) if(BigEndian==nil) then out = string.unpack('>I',out) else out = string.unpack('<I',out) end return string.upper(string.format("%08x", out)) end function Int2StrHex(data,BigEndian) -- 输入16位的带符号整数,输出转为16进制数据的字符串形式 -- 默认小端编码,若要使用大端编码,使用BigEndian out = string.pack('i2',data) if(BigEndian==nil) then out = string.unpack('>I2',out) else out = string.unpack('<I2',out) end return string.upper(string.format("%04x", out)) end function Float2StrHex(data,BigEndian) -- 输入浮点数,输出转为16进制数据的字符串形式 -- 默认小端编码,若要使用大端编码,使用BigEndian out = string.pack('f',data) if(BigEndian==nil) then out = string.unpack('>I',out) else out = string.unpack('<I',out) end return string.upper(string.format("%08x", out)) end function StrHex2Int(s,BigEndian) -- 输入2字节的16进制数据的字符串形式,返回对应带符号整数 -- 默认小端编码,若要使用大端编码,使用BigEndian out= tonumber(s,16) if(BigEndian==nil) then out = string.pack('>I2',out) else out = string.pack('<I2',out) end out= string.unpack("i2", out) return out end function StrHex2Dint(s,BigEndian) -- 输入4字节的16进制数据的字符串形式,返回对应带符号整数 -- 默认小端编码,若要使用大端编码,使用BigEndian out= tonumber(s,16) if(BigEndian==nil) then out = string.pack('>I',out) else out = string.pack('<I',out) end out= string.unpack("i", out) return out end function StrHex2Float(s,BigEndian) -- 输入4字节的16进制数据的字符串形式,返回对应浮点数 -- 默认小端编码,若要使用大端编码,使用BigEndian out= tonumber(s,16) if(BigEndian==nil) then out = string.pack('>I',out) else out = string.pack('<I',out) end out= string.unpack("f", out) return out end -------------------------------------------------- -- 浮点数例子 print(StrHex2Float('3F800000',true)) -- 例如传入的是'3F800000',高字节在前,返回1.0 print(StrHex2Float('0000803F')) -- 例如传入的是'0000803F',低字节在前,返回1.0 print(Float2StrHex(1.0,true)) -- 输入1.0,返回高字节在前的16进制数据的字符串形式'3F800000' print(Float2StrHex(1.0)) -- 输入1.0,返回低字节在前的16进制数据的字符串形式'0000803F' -------------------------------------------------- -------------------------------------------------- --32位带符号整数例子 print(Dint2StrHex(70000)) -- 输入十进制数据70000,返回低字节在前的16进制数据的字符串形式'70110100' print(Dint2StrHex(70000,true)) -- 输入十进制数据70000,返回高字节在前的16进制数据的字符串形式'00011170' print(StrHex2Dint('70110100')) -- 输入低字节在前的16进制数据的字符串形式'70110100',返回十进制数据70000 print(StrHex2Dint('00011170',true)) -- 输入高字节在前的16进制数据的字符串形式'00011170',返回十进制数据70000 -------------------------------------------------- -------------------------------------------------- --16位带符号整数例子 print(Int2StrHex(-2)) -- 输入十进制数据 -2,返回低字节在前的16进制数据的字符串形式'FEFF' print(Int2StrHex(-2,true)) -- 输入十进制数据 -2,返回高字节在前的16进制数据的字符串形式'FFFE' print(StrHex2Int('FEFF')) -- 输入低字节在前的16进制数据的字符串形式'FEFF',返回十进制数据-2 print(StrHex2Int('FFFE',true)) -- 输入高字节在前的16进制数据的字符串形式'FFFE',返回十进制数据-2 --------------------------------------------------