如何将Base64格式传感器数据还原为带空格的原始Hex格式?
问题:将Base64编码的传感器Hex数据还原为原始格式?
问题背景
传感器生成的原始Hex数据格式如下(带空格分隔):
DD 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2FE 0 0 0 1F4 1FA 123 141 F0E F56 F56 12 0 154B 0 264 F53 2FC6 A2D CEC C8 F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2BC 0 0 0 1F4 10F 123 141 DD8 E2B E2B 10 0 1500 0 264 840B 2FC6 A2D CEF C2 B 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2BC 0 10A 0 1F4 19B 122 141 DA4 12AA 149E 13 0 155C 0 264 B92 2FC6 A2D CEF BD E 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2FE 0 0 0 1F4 123 123 140 D5D DD3 461C 13 0 1530 2 264 34C1 2FBC A2B CEB D4 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 362 0 0 0 1F4 1 122 141 E66 ED3 ED3 8 0 150D 3 265 4E39 2FBC A2B CEB
不受控制的采集系统将上述数据存储为Base64格式,读取后得到包含该Base64数据的Pandas DataFrame,目标是还原为原始带空格的Hex格式,但当前转换结果不符合预期,非Pandas代码还报错。
用户的示例代码及问题
生成包含Base64数据的DataFrame
import pandas as pd import base64 # 示例DataFrame df = pd.DataFrame([['2024-06-21 06:22:38', 22958 ,'IEUgMyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDMyMCAwIDAgMCAxRjQgMjg3IEU1IDE4MiAxOTYgMUE1IDFBNSAwIDAgQSAxIDI2QiBEMTIyIHhkYXRhNTEwMiAyRDAgNzkwICAxMDk4'], ['2024-06-21 06:22:39', 22959 ,'IDExIDMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzNjIgMCAwIDAgMUY0IDI3MyBFNSAxODIgMUQwIDFFMCAxRTAgMCAwIEIgMSAyNkIgQTgyQSB4ZGF0YTUxMDIgMkQwIDc5MCAgMTA5OA=='], ['2024-06-21 06:22:40', 22960 ,'IDEwIDEgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzMjAgMCAwIDAgMUY0IDI3RCBFNSAxODIgMUY1IDRCOCA1MUIgMSAwIDcgMCAyNkIgQjUwRSB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='], ['2024-06-21 06:22:41', 22961 ,'IEQgNCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDJGRSAwIDAgMCAxRjQgMjkgRTUgMTgyIDFBRSAxQzAgMUMwIDAgMCA4IDIgMjZCIDJCRTQgeGRhdGE1MTAyIDJEMSA3OEQgIDEwOTI='], ['2024-06-21 06:22:42', 22962 ,'IEQgMiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDNBNSAwIDAgMCAxRjQgMSBFNSAxODIgMTUzIDE1RSAxNUUgMCAwIDkgMCAyNkIgNjFBMiB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='], ], columns=['time', 'UTCs', 'Parameter1']) print(df)
错误的转换代码及结果
用户尝试将Parameter1转换为Hex格式:
df['Parameter1_hex'] = df['Parameter1'].apply(lambda x: base64.b64decode(x).hex()) df['Parameter1_hex']
得到的结果是字节的十六进制表示,并非原始Hex数据:
0 2045203320302030203020302030203020302030203020... 1 2031312033203020302030203020302030203020302030... 2 2031302031203020302031203020302030203020302030... 3 2044203420302030203020302030203020302030203020... 4 2044203220302030203020302030203020302030203020... Name: Parameter1_hex, dtype: object
非Pandas代码的错误
用户尝试不使用Pandas转换,出现TypeError:
TypeError: argument should be a bytes-like object or ASCII string, not 'list'
对应的代码:
import base64 data =[ ['2024-06-21 06:22:38', 22958 ,'IEUgMyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDMyMCAwIDAgMCAxRjQgMjg3IEU1IDE4MiAxOTYgMUE1IDFBNSAwIDAgQSAxIDI2QiBEMTIyIHhkYXRhNTEwMiAyRDAgNzkwICAxMDk4'], ['2024-06-21 06:22:39', 22959 ,'IDExIDMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzNjIgMCAwIDAgMUY0IDI3MyBFNSAxODIgMUQwIDFFMCAxRTAgMCAwIEIgMSAyNkIgQTgyQSB4ZGF0YTUxMDIgMkQwIDc5MCAgMTA5OA=='], ['2024-06-21 06:22:40', 22960 ,'IDEwIDEgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzMjAgMCAwIDAgMUY0IDI3RCBFNSAxODIgMUY1IDRCOCA1MUIgMSAwIDcgMCAyNkIgQjUwRSB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='], ['2024-06-21 06:22:41', 22961 ,'IEQgNCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDJGRSAwIDAgMCAxRjQgMjkgRTUgMTgyIDFBRSAxQzAgMUMwIDAgMCA4IDIgMjZCIDJCRTQgeGRhdGE1MTAyIDJEMSA3OEQgIDEwOTI='], ['2024-06-21 06:22:42', 22962 ,'IEQgMiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDNBNSAwIDAgMCAxRjQgMSBFNSAxODIgMTUzIDE1RSAxNUUgMCAwIDkgMCAyNkIgNjFBMiB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='], ] hex_data = base64.b64decode([row[2] for row in data]) print(hex_data)
解决方案
核心问题分析
采集系统是将**原始带空格的Hex字符串(ASCII格式)**直接做了Base64编码,而非将二进制Hex数据编码。所以解码时需要还原为原始字符串,而非转成字节的十六进制表示。
1. Pandas中的正确转换方法
将Base64解码后,把字节对象解码为ASCII字符串,即可得到原始带空格的Hex格式:
df['Parameter1_raw'] = df['Parameter1'].apply(lambda x: base64.b64decode(x).decode('ascii')) # 查看结果 print(df['Parameter1_raw'])
这样得到的就是和传感器输出一致的带空格的Hex字符串,例如第一条数据会还原为:
E 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 320 0 0 0 1F4 287 E5 182 196 1A5 1A5 0 0 A 1 26B D122 xdata5102 2D0 790 1098
2. 修复非Pandas代码的错误
base64.b64decode()只能接收单个字符串/字节对象,不能直接传入列表。需要遍历列表逐个解码:
import base64 data =[ # 原始data列表 ] # 逐个解码并转成ASCII字符串 hex_data = [base64.b64decode(row[2]).decode('ascii') for row in data] # 打印每条结果 for idx, item in enumerate(hex_data): print(f"第{idx+1}条原始数据:") print(item)
这样就能正确还原所有数据,且不会抛出类型错误。
总结
- 不要使用
.hex()方法,它会把解码后的字节对象转成十六进制字符串(表示字节本身的编码),而非还原原始内容 - 正确流程:
Base64字符串 → base64.b64decode()得到字节 → .decode('ascii')转成原始带空格的Hex字符串
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

