将base64转换为十六进制,结果中带有分隔符
我有一个传感器,会生成原始的十六进制数据,看起来像这样:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。