
在现代编程实践中,数据格式转换是一项常见的任务,尤其当涉及到不同系统间的通信、存储或处理时,数值类型如整数和浮点数有不同的存储方式。
单精度浮点数(Float32):
字节顺序:
大小端字节序(Endianess)是计算机系统在内存中存储多字节数据时的一种顺序约定。它们主要区别在于如何安排一个多字节数据类型(如整数、浮点数等)在连续内存地址中的字节排列方式。
0x12 0x34 0x56 0x780x78 0x56 0x34 0x12大小端的区别在于对于一个多字节数值,字节序列的起始部分(最高位或最低位)是在内存中的较低地址还是较高地址开始存放。这种差异会导致数据在网络传输、文件存储以及不同字节序系统之间交互时需要进行转换。
在线工具参考:
浮点数十六进制转换器:https://www.asciim.cn/hex/float.html

前端将percentage转换为单精度float小端,比如:
00 00 20 4100 00 80 3F00 00 00 40这段代码定义了一个JavaScript函数 convertPercentageToLittleEndianHex,其功能是将输入的百分比数值转换为小端字节序的单精度浮点数,并最终输出一个由4个十六进制字节组成的字符串(每个字节用两个十六进制字符表示,并以空格分隔):
// 定义一个函数,它接受百分比并将它转换为小端字节序的单精度浮点数的十六进制字符串
function convertPercentageToLittleEndianHex(percentage) {
// 创建一个大小为4字节的ArrayBuffer对象,用于存储单精度浮点数
let buffer = new ArrayBuffer(4);
// 创建一个Float32Array视图,将百分比转换为0到1之间的浮点数并存入
let floatView = new Float32Array(buffer);
// 如果是纯数值则floatView[0] = percentage
floatView[0] = percentage / 100; // 先将百分比归一化为小数
// 创建一个Int32Array视图,读取同一位置上的单精度浮点数的小端字节序整数值
let int32View = new Int32Array(buffer);
// 将整数值转换为十六进制字符串,并确保至少有8个字符(4个字节)
let hex = int32View[0].toString(16).padStart(8, '0');
// 按照小端字节序显示习惯,将十六进制字符串按字节反转并用空格分隔
hex = hex.match(/.{2}/g).reverse().join(' ');
return hex;
}代码逐步解析
let buffer = new ArrayBuffer(4);ArrayBuffer是JavaScript中用于表示通用、固定长度二进制数据缓冲区的对象。这里创建了一个大小为4字节(32位)的ArrayBuffer,因为单精度浮点数在内存中占用32位。
let floatView = new Float32Array(buffer);
floatView[0] = percentage / 100;创建一个与ArrayBuffer关联的Float32Array视图,它允许我们像操作数组一样对存储在ArrayBuffer中的单精度浮点数进行读写。
floatView[0] = percentage / 100;将输入的百分比除以100后赋值给 floatView[0],这样就将百分比转换为了0到1之间的浮点数,这里将输入的百分比值除以100归一化到0到1之间后,存入floatView的第一个元素。
let int32View = new Int32Array(buffer);同样地,创建一个与同一个ArrayBuffer关联的Int32Array视图,用于读取存储在ArrayBuffer中的单精度浮点数的小端字节序整数值。在JavaScript中,所有原始类型数组(如Int32Array、Uint8Array等)都遵循宿主系统的字节序,大多数现代系统都是小端字节序。
let hex = int32View[0].toString(16).padStart(8, '0');通过Int32Array视图获取到的整数值是一个32位小端字节序的浮点数表示,将其转换为十六进制字符串形式。使用toString(16)方法实现这种转换,然后使用padStart确保字符串始终包含8个字符(即4个字节的十六进制表示),不足部分用零填充。
hex = hex.match(/.{2}/g).reverse().join(' ');此处利用正则表达式匹配十六进制字符串中的每两个字符一组,再通过reverse()方法反转这些组,这样就得到了符合小端字节序显示习惯的十六进制字符串。最后,使用join(' ')方法在每个字节之间插入空格,以便于阅读。
在实际的开发项目中,convertPercentageToLittleEndianHex 函数可以应用于以下场景:
多媒体数据通常以二进制格式存储和传输。例如,在编码和解码过程中,音量、像素亮度等参数可能需要以浮点数表示,并按照特定字节序进行处理。本函数可以帮助我们将百分比形式的音量调节值转换为小端字节序的单精度浮点数,以便嵌入到音频文件的元数据中。
在物联网设备间的数据交换中,设备状态、传感器读数等信息可能需要通过无线协议如MQTT、CoAP等发送。这些协议可能会规定数据应以小端字节序的浮点数形式传递,此时该函数能确保将设备上报的百分比数据正确转换并封装成网络消息。
编写与硬件交互的驱动程序时,由于不同架构的CPU对字节序有不同的要求,开发者需要根据目标硬件的特性来调整数据格式。本函数在此类场景中可以作为中间工具,将软件层面上的百分比数值适配为目标硬件所需的字节顺序和数据类型。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。