在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
--------------------------------------------------