Создание байтового объекта в Python3.x

У меня вопрос по поводу python3. Я уже несколько дней пытаюсь создать байтовый объект, который выглядит так:

b"'\x10\x00\x0020180425"

Первая часть \ x10 \ x00 \ x00 - это два объединенных объекта int16. Вот как я пытался их совместить:

array = [0,0,0,0,1,9,7,0,0,1,0,1]
blebytes = bytearray(array)

z = np.int16(20)
blebytes[0] = (z & 0xFF00) >> 8
blebytes[1] = (z & 0x00FF)

z = np.int16(123)
blebytes[2] = (z & 0xFF00) >> 8
blebytes[3] = (z & 0x00FF)

Вторая часть (20180425) - это как раз сегодняшняя дата. Я пытаюсь сделать вот так:

datestr = time.strftime("%Y%m%d")
for i in range(0,8):
    blebytes[i+4] = np.int16(datestr[i])
print(blebytes)

Но если я напечатаю свой массив blebytes, он будет выглядеть так:

bytearray(b'\x04\xe8\t\xf7\x02\x00\x01\x08\x00\x04\x02\x05')

Что я делаю неправильно? Кто-нибудь может мне помочь?

Используйте ord(datestr[i]) в петле. Это даст вам порядковые номера ascii строковых символов вместо байтовых значений, установленных для этих чисел, что вам и нужно. Вкратце: ord("2") == 50 != 2.

Jeronimo 25.04.2018 13:14

Спасибо, но все равно не то .. Вот как выглядит сейчас: bytearray(b'\x00\x14\x00{20180425')

Simon Klamt 25.04.2018 13:34

Вы уверены, что исходные кодированные значения были 20 и 123? Похоже, они не имеют отношения к '\x10\x00\x00 ...

Jeronimo 25.04.2018 15:11

Ой, извините, это была моя вина, не упомянул об этом. Нет, 20 и 123 - это всего лишь два случайных числа для тестирования. Он должен работать с каждыми двумя числами типа int16.

Simon Klamt 25.04.2018 15:23

Итак, для ваших 20 и 123 я получу b'\x00\x14\x00{' в качестве первой части. Что бы вы хотели увидеть здесь вместо этого?

Jeronimo 25.04.2018 16:25

Для значений z, которые я выбрал сейчас: z1 = -14113 and z2 = 18402 Следовательно, сконструированный тип байта выглядит так: b'\xc8\xdfG\xe220180425' Но он все равно выглядит немного иначе, чем оригинал: b"'\xc8\xdfG\xe220180425" На самом деле только этот " отсутствует в начале ..

Simon Klamt 25.04.2018 16:26

Так что просто о том, какие они были числа? Вы можете использовать int.from_bytes(b"'\x10", "big", signed=True), чтобы найти их. Осторожно, я только угадал byteorder и подписал.

Jeronimo 25.04.2018 16:34

Хорошо, два типа int 16 должны быть с прямым порядком байтов. Если я правильно понял, \x10 предназначен для первого числа, \x00 - для второго числа, а остальные \x0020180425 - для даты. Как все это объединить в такую: b"'\x10\x00\x0020180425"? Итак, теперь моя проблема состоит в том, чтобы преобразовать записи blebytes [0] + blebytes [1] в один большой байт с прямым порядком байтов, а blebytes [2] + blebytes [3] - в другой.

Simon Klamt 26.04.2018 10:50

Первое число - b"'\x10" - апостроф также является байтом, просто замененным его представлением в формате ascii, а второе число - b"\x00\x00". Итак, по 16 бит каждый. Предполагая обратный порядок байтов, эти два числа были 10000 и 0. Используя их, вы должны получить точный массив байтов, как указано выше, с кодом, который у вас уже есть.

Jeronimo 26.04.2018 11:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
66
0

Другие вопросы по теме