You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 18:17:25