四字节数组转为float

十六进制字符串转四字节数组转float

       在接触modbus报文过程中,发现报文中有的数值的表示方式为4字节浮点型;如下是我对四字节浮点型相关概念的理解与转换代码;

相关概念

以下仅是我个人对概念的理解,存在一点的不足和偏差;若想理解规范的概念请自查。

小终端与大终端

在了解大终端、小终端之前需了解高低位;高低位是以权位来区别的;
    数值:12        高位:1        低位:2        原因:十位的权重高于个位的权重

大终端: 高字节在前,ABCD
小终端: 低字节在前,DCBA
eg:大终端 3E 56 04 19         小终端 19 04 56 3E

转换代码

十六进制字符串转float类型有两步,第一:将十六进制字符串转为字节数组;
							第二:将字节数组转为float类型(如下两种方法);
/** 用于解析四字节转float
 * 何处调用:雷达流量计报文解析工具
 * */
public class HexToFloat {

    /**小终端 十六进制  四字节转float*/
    public static Float smallHextoFloat(String s) throws IOException {//s 为报文中截取的对应值 eg:19 04 56 3E  且数值的表示方式为四字节浮点型、小终端低字节在前

        String s1 = s.replace(" ", "");//将字符串中的空格去除
        String s2 = s.substring(6,8) + s.substring(4,6) + s.substring(2,4) + s.substring(0,2);/*将小终端换为大终端*/
        return bigHextoFloat(s2);
    }

    /**大终端 十六进制 四字节转float*/
    public static Float bigHextoFloat(String s) throws IOException {//s 为报文中截取的对应值 eg:3E 56 04 19  且数值的表示方式为四字节浮点型、大终端高字节在前
        String src = s.replace(" ", "");//将字符串中的空格去除
        /**将十六进制字符串转为字节数组*/
        byte[] ret = new byte[src.length() / 2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < (tmp.length / 2); i++) {
            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
        }

//        流输入,适用于ME/SE环境
        /**将字节数组转为float类型数据 第一种*///默认大端数,如果小端数,可以先翻转数组
        DataInputStream dis=new DataInputStream(new ByteArrayInputStream(ret));
        float f=dis.readFloat();
        dis.close();
        return f;
    }

    /**
     * 将十六进制字符串转为字节数组*/
    public static byte uniteBytes(byte src0, byte src1) {
        byte _b0 = Byte.decode("0x" + new String(new byte[] {src0})).byteValue();
        _b0 = (byte) (_b0 << 4);
        byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
        byte ret = (byte) (_b0 ^ _b1);
        return ret;
    }
    /**
     * 将字节数组转换成16进制字符串 第二种
     * @param bytes
     * @return
     */
    public static String bytes2BinaryStr(byte[] bytes){
        StringBuffer binaryStr = new StringBuffer();
        for(int i=0;i<bytes.length;i++){
            String str = Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1);
            binaryStr.append(str);
        }
        return binaryStr.toString();
    }

}

在MFC(Microsoft Foundation Classes)环境下,将四字节数据转换为浮点数(float)类型,通常涉及底层数据的直接内存操作。由于 `float` 类型在大多数系统中是以 4字节(32 位)表示的,因此可以使用指针转换或 `union` 的方式来实现这一目标。以下是一些常见的实现方法。 ### 使用指针强制转换 一种直接的方式是将四字节数据的指针转换为 `float` 类型指针,然后通过解引用获取浮点数。这种方法适用于数据已经以字节形式存储在 `unsigned char` 数组中的情形: ```cpp unsigned char bytes[4] = {0x00, 0x00, 0x80, 0x3F}; // 示例数据,表示 1.0f float value = *(reinterpret_cast<float*>(bytes)); ``` 上述代码中,`bytes` 数组的四个字节被重新解释为一个 `float` 类型,结果为 `1.0f`。这种转换依赖于 IEEE 754 浮点数标准,适用于大多数现代系统[^3]。 ### 使用联合体(Union) 另一种方法是利用 `union` 来共享内存空间,使得四字节数据和浮点数共享同一块内存,从而实现转换: ```cpp union ByteFloatUnion { unsigned char bytes[4]; float value; }; ByteFloatUnion u; u.bytes[0] = 0x00; u.bytes[1] = 0x00; u.bytes[2] = 0x80; u.bytes[3] = 0x3F; // 现在 u.value 是 1.0f ``` 这种方法避免了显式的指针转换,代码可读性更强,并且在某些编译器优化或严格类型检查环境下更安全[^1]。 ### 在 MFC 中的应用 在 MFC 环境下,可以将上述方法嵌入到类或函数中,以实现更通用的数据转换逻辑。例如,可以将四字节数据作为参数传入函数,并返回对应的浮点数: ```cpp float ConvertToFloat(const unsigned char* data) { return *(reinterpret_cast<const float*>(data)); } ``` 在 MFC 对话框或视图类中,可以结合控件操作和数据输入进行动态转换: ```cpp void CMyDialog::OnConvert() { unsigned char data[4]; // 假设从某个输入源获取四字节数据 data[0] = 0x00; data[1] = 0x00; data[2] = 0x80; data[3] = 0x3F; float result = ConvertToFloat(data); CString strResult; strResult.Format(_T("%f"), result); SetDlgItemText(IDC_RESULT_EDIT, strResult); } ``` 此代码片段展示了如何在 MFC 中获取四字节数据并将其转换为浮点数,最后通过 `CString::Format` 函数将其显示在编辑框中[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值