столбец строки панд от base64 до hex - PullRequest
0 голосов
/ 24 июня 2018

Итак, у меня есть фрейм данных pandas, который классифицируется как «объект», но на самом деле представляет собой полезную нагрузку в кодировке base64, которую я хочу преобразовать в шестнадцатеричное.

raw
AIgIm/H/SfwAR2IBAgMgAgIAAQMCAFoAcQAAAAAAAAFxAAAAAAAAA4gAAABiAF8AABI=
AIgIm/v/SfsAUNwBAgMgAgIAEgMCAEIAcQAAAAAAAAFxAAAAAAAAA4gAAABkAF8AAAw=
AIgIm/z/Sg4AVroBAgMgAgIA6wMCAFgAcQAAAAAAAAFxAAAAAAAAA4geAAFEADoAGQs=

Используя https://cryptii.com/base64-to-hex я получаю эти значения (что я и ожидаю):

new_raw
00 88 08 9b f1 ff 49 fc 00 47 62 01 02 03 20 02 02 00 01 03 02 00 5a 00 71 00 00 00 00 00 00 01 71 00 00 00 00 00 00 03 88 00 00 00 62 00 5f 00 00 12
00 88 08 9b fb ff 49 fb 00 50 dc 01 02 03 20 02 02 00 12 03 02 00 42 00 71 00 00 00 00 00 00 01 71 00 00 00 00 00 00 03 88 00 00 00 64 00 5f 00 00 0c
00 88 08 9b fc ff 4a 0e 00 56 ba 01 02 03 20 02 02 00 eb 03 02 00 58 00 71 00 00 00 00 00 00 01 71 00 00 00 00 00 00 03 88 1e 00 01 44 00 3a 00 19 0b

Исходя из ранее заданных похожих вопросов, я попробовал:

df['new_raw'] = df['raw'].apply(lambda x: x.decode("base64").encode("hex"))

Но это дает мне:

AttributeError: 'str' object has no attribute 'decode'` error.

1 Ответ

0 голосов
/ 24 июня 2018

У вас есть строковые объекты Python 3, у которых нет метода .decode().Декодирование - это то, что вы делаете для байтовых значений, чтобы получить строки, строки, которые вы бы кодировали .Похоже, вы нашли какой-то специфический для Python 2 код, который выполняет преобразование, которое несовместимо.

Чтобы преобразовать данные Base64 в двоичные, а затем в шестнадцатеричные, используйте модуль base64 , а затемвызовите метод .hex():

import base64

df['raw'].apply(lambda b: base64.b64decode(b).hex())

Демо:

>>> import pandas as pd
>>> import base64
>>> df = pd.DataFrame({'raw': '''\
... AIgIm/H/SfwAR2IBAgMgAgIAAQMCAFoAcQAAAAAAAAFxAAAAAAAAA4gAAABiAF8AABI=
... AIgIm/v/SfsAUNwBAgMgAgIAEgMCAEIAcQAAAAAAAAFxAAAAAAAAA4gAAABkAF8AAAw=
... AIgIm/z/Sg4AVroBAgMgAgIA6wMCAFgAcQAAAAAAAAFxAAAAAAAAA4geAAFEADoAGQs=
... '''}, index=[0, 1, 2])
>>> df['raw'].apply(lambda b: base64.b64decode(b).hex())
0    0088089bf1ff49fc00476201020320020200010302005a...
1    0088089bf1ff49fc00476201020320020200010302005a...
2    0088089bf1ff49fc00476201020320020200010302005a...
Name: raw, dtype: object
...