lua中16进制数据的字符串形式转浮点数/整数

在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
--------------------------------------------------
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
397
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明