如何使用R将十六进制hex数据转换为实数
十六进制原始数据转实数的可行方案
前置说明
- 你提供的原始十六进制数据默认按嵌入式采集场景下的小端字节序存储,常见解析前需要先将原始数据清理为连续字节流后,可按常用的16位有符号整数、32位单精度浮点数两种格式分别解析:
- 注意:如果解析后数值不符合你的业务预期,可以自行调整字节序、数值类型两个核心参数即可
Python实现代码
import struct import binascii # 第一步:读取原始十六进制字符串 raw_hex = """0400 0000 cf40 2761 d2ff 5552 ceff 5652 e0ff 5b52 e0ff 5b52 eaff 5f52 f4ff 5b52 eaff 5852 eeff 5752 f2ff 5952 eeff 5a52 d8ff 5452 d4ff 5652 caff 5452 ccff 5352 d2ff 5552 c2ff 5a52 ccff 5e52 e2ff 5652 eaff 5852 f0ff 5652 e8ff 5452 e8ff 5452 eaff 5552 deff 5a52 f0ff 5f52 faff 5b52 0a00 6152 0400 6352 f8ff 5f52 0000 5c52 f8ff 5952 0200 5452 0000 5452 f2ff 5952 f8ff 5a52 0400 5652 0400 5652 f2ff 5c52""" # 第二步:清理数据,去掉空格和换行符 clean_hex = raw_hex.replace(" ", "").replace("\n", "") # 转为二进制字节流 byte_data = binascii.unhexlify(clean_hex) # 方案1:解析为16位有符号小端整数 int16_list = struct.unpack(f'<{len(byte_data)//2}h', byte_data) print("16位有符号整数解析结果前10个:", int16_list[:10]) # 方案2:解析为32位单精度小端浮点数 float32_list = struct.unpack(f'<{len(byte_data)//4}f', byte_data) print("32位单精度浮点数解析结果前10个:", float32_list[:10])
R实现代码
# 第一步:读取并清理原始十六进制数据 raw_hex <- "0400 0000 cf40 2761 d2ff 5552 ceff 5652 e0ff 5b52 e0ff 5b52 eaff 5f52 f4ff 5b52 eaff 5852 eeff 5752 f2ff 5952 eeff 5a52 d8ff 5452 d4ff 5652 caff 5452 ccff 5352 d2ff 5552 c2ff 5a52 ccff 5e52 e2ff 5652 eaff 5852 f0ff 5652 e8ff 5452 e8ff 5452 eaff 5552 deff 5a52 f0ff 5f52 faff 5b52 0a00 6152 0400 6352 f8ff 5f52 0000 5c52 f8ff 5952 0200 5452 0000 5452 f2ff 5952 f8ff 5a52 0400 5652 0400 5652 f2ff 5c52" clean_hex <- gsub(" |\n", "", raw_hex) # 转为二进制字节流 hex_split <- strsplit(clean_hex, "")[[1]] byte_data <- as.raw(paste0(hex_split[c(TRUE, FALSE)], hex_split[c(FALSE, TRUE)])) # 方案1:解析为16位有符号小端整数 int16_list <- readBin(byte_data, what = integer(), size = 2, endian = "little", n = length(byte_data)/2) print("16位有符号整数解析结果前10个:") print(head(int16_list, 10)) # 方案2:解析为32位单精度小端浮点数 float32_list <- readBin(byte_data, what = numeric(), size = 4, endian = "little", n = length(byte_data)/4) print("32位单精度浮点数解析结果前10个:") print(head(float32_list, 10))
异常调整规则
- 数值范围不符合预期时,把字节序参数从
</little改为>/big切换为大端序尝试 - 精度不符合预期时,调整数值长度参数:Python中把
h/f改为q/d,R中把size改为8,即可适配64位整数/浮点数解析 - 若原始数据为本地二进制文件时,直接读取二进制流解析即可,无需先转为十六进制字符串再处理
内容的提问来源于stack exchange,提问作者ainsuotain
相关产品推荐
相关产品推荐

