Построить массив Numpy из шестнадцатеричной строки - PullRequest
4 голосов
/ 01 апреля 2020

У меня есть шестнадцатеричная строка "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49", которая будет указана c, она будет содержать данные изображения.

Я хочу преобразовать его в массив Numpy или, возможно, восстановить изображение OpenCV из указанных данных.

Ширина и высота также указываются, так что размеры массива Numpy известны.

Как я могу построить массив Numpy из приведенной выше строки?

Ответы [ 5 ]

3 голосов
/ 01 апреля 2020

Мы могли бы использовать np.fromiter и приводить отдельные строки к шестнадцатеричному, используя аргумент base в int, а затем к целочисленному типу, используя аргумент dtype в np.fromiter :

s = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"

np.fromiter((int(x, 16) for x in s.split('-')), dtype=np.int32)
# array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])
0 голосов
/ 01 апреля 2020

Если речь идет об эффективности памяти, две цифры шестнадцатеричного числа соответствуют 8-разрядному целому числу без знака (ie, числа от 0 до 255).

Чтобы вернуться к исходной строке, вы можете использовать format(number, '02x') (строка шестнадцатеричного числа с двумя нулями)

hex_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"

arr = np.fromiter((int(x, 16) for x in hex_str.split('-')), dtype=np.uint8)

assert hex_str == '-'.join((format(number, '02x') for number in arr)).upper()
0 голосов
/ 01 апреля 2020
import numpy as np
arr = np.array([int(x, 16) for x in "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49".split("-")])
print(arr)
0 голосов
/ 01 апреля 2020

Вы можете split строку с помощью da sh и преобразовать отдельные числа base-16 в int.

>>> import numpy as np
>>> hext_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"
>>> np.array([int(x, 16) for x in hex_str.split("-")])
array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])

При условии, что (n, m) - это размеры вашего изображения, которые вы можете использовать на результат .reshape((n, m)) метод np.array.

0 голосов
/ 01 апреля 2020

Вы можете использовать список понимания и встроенный модуль int для преобразования из шестнадцатеричной в десятичную дробную строку:

import numpy as np

hex_string = '89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49'
np.array([int(x, base=16) for x in hex_string.split('-')])
...