将base64转换为十六进制,结果中带有分隔符

编程语言 2026-07-09

我有一个传感器,会生成原始的十六进制数据,看起来像这样:

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格式存储。 在我的Python 3脚本中读取这些数据,会得到一个包含base64数据的pandas DataFrame。

我的目标是把这段base64数据还原回原本的十六进制格式。 用于实现这一目标的代码得到的结果与我预期的不同。 我在其他问题中也找不到解决方案。

下面是一个创建包含base64示例数据的DataFrame的示例代码,展示了我在脚本中如何读取它:

import pandas as pd
import base64

# A simple example dataframe with time, UTCs, and one column of additional imaginary data
df = pd.DataFrame([['2024-06-21 06:22:38', 22958 ,'IEUgMyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDMyMCAwIDAgMCAxRjQgMjg3IEU1IDE4MiAxOTYgMUE1IDFBNSAwIDAgQSAxIDI2QiBEMTIyIHhkYXRhNTEwMiAyRDAgNzkwICAxMDk4'],
                   ['2024-06-21 06:22:39', 22959 ,'IDExIDMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzNjIgMCAwIDAgMUY0IDI3MyBFNSAxODIgMUQwIDFFMCAxRTAgMCAwIEIgMSAyNkIgQTgyQSB4ZGF0YTUxMDIgMkQwIDc5MCAgMTA5OA=='],
                   ['2024-06-21 06:22:40', 22960 ,'IDEwIDEgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzMjAgMCAwIDAgMUY0IDI3RCBFNSAxODMgMUY1IDRCOCA1MUIgMSAwIDcgMCAyNkIgQjUwRSB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='],
                   ['2024-06-21 06:22:41', 22961 ,'IEQgNCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDJGRSAwIDAgMCAxRjQgMjkgRTUgMTgyIDFBRSAxQzAgMUMwIDAgMCA4IDIgMjZCIDJCRTQgeGRhdGE1MTAyIDJEMSA3OEQgIDEwOTI='],
                   ['2024-06-21 06:22:42', 22962 ,'IEQgMiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDNBNSAwIDAgMCAxRjQgMSBFNSAxODIgMTUzIDE1RSAxNUUgMCAwIDkgMCAyNkIgNjFBMiB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='],
                   ], 
                  columns=['time', 'UTCs', 'Parameter1'])
print(df)

我把参数1 转换为十六进制编码,命名为Parameter1_hex:

df['Parameter1_hex'] = df['Parameter1'].apply(lambda x: base64.b64decode(x).hex())
df['Parameter1_hex']

结果是:

0    2045203320302030203020302030203020302030203020...
1    2031312033203020302030203020302030203020302030...
2    2031302031203020302031203020302030203020302030...
3    2044203420302030203020302030203020302030203020...
4    2044203220302030203020302030203020302030203020...
Name: Parameter1_hex, dtype: object

如何把base64格式的数据还原回原始格式?我还缺少了什么?

我尝试在不使用pandas的情况下提供一个可复现的示例,并保留 hex(),但它得到了一个

TypeError: 参数应为字节序列或ASCII字符串,而不是 'list'

import base64

# A simple example data set with time, UTCs, and one column of additional imaginary data
data =[
    ['2024-06-21 06:22:38', 22958 ,'IEUgMyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDMyMCAwIDAgMCAxRjQgMjg3IEU1IDE4MiAxOTYgMUE1IDFBNSAwIDAgQSAxIDI2QiBEMTIyIHhkYXRhNTEwMiAyRDAgNzkwICAxMDk4'],
    ['2024-06-21 06:22:39', 22959 ,'IDExIDMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzNjIgMCAwIDAgMUY0IDI3MyBFNSAxODIgMUQwIDFFMCAxRTAgMCAwIEIgMSAyNkIgQTgyQSB4ZGF0YTUxMDIgMkQwIDc5MCAgMTA5OA=='],
    ['2024-06-21 06:22:40', 22960 ,'IDEwIDEgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzMjAgMCAwIDAgMUY0IDI3RCBFNSAxODMgMUY1IDRCOCA1MUIgMSAwIDcgMCAyNkIgQjUwRSB4ZGF0YTUxMDIgMkQxIDc4RCAgMTA5Mg=='],
    ['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_data = base64.b64decode([row[2] for row in data])
#print(hex_data)
for row in data:
    decoded = base64.b64decode(row[2])
    print(decoded.hex())

#or another option
decoded_data = [base64.b64decode(row[2]).decode('utf-8', errors='ignore') for row in data]

for d in decoded_data:
    print(d)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章