У меня вопрос по поводу 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')
Что я делаю неправильно? Кто-нибудь может мне помочь?
Спасибо, но все равно не то .. Вот как выглядит сейчас: bytearray(b'\x00\x14\x00{20180425')
Вы уверены, что исходные кодированные значения были 20 и 123? Похоже, они не имеют отношения к '\x10\x00\x00 ...
Ой, извините, это была моя вина, не упомянул об этом. Нет, 20 и 123 - это всего лишь два случайных числа для тестирования. Он должен работать с каждыми двумя числами типа int16.
Итак, для ваших 20 и 123 я получу b'\x00\x14\x00{' в качестве первой части. Что бы вы хотели увидеть здесь вместо этого?
Для значений z, которые я выбрал сейчас: z1 = -14113 and z2 = 18402 Следовательно, сконструированный тип байта выглядит так: b'\xc8\xdfG\xe220180425' Но он все равно выглядит немного иначе, чем оригинал: b"'\xc8\xdfG\xe220180425" На самом деле только этот " отсутствует в начале ..
Так что просто о том, какие они были числа? Вы можете использовать int.from_bytes(b"'\x10", "big", signed=True), чтобы найти их. Осторожно, я только угадал byteorder и подписал.
Хорошо, два типа int 16 должны быть с прямым порядком байтов. Если я правильно понял, \x10 предназначен для первого числа, \x00 - для второго числа, а остальные \x0020180425 - для даты. Как все это объединить в такую: b"'\x10\x00\x0020180425"? Итак, теперь моя проблема состоит в том, чтобы преобразовать записи blebytes [0] + blebytes [1] в один большой байт с прямым порядком байтов, а blebytes [2] + blebytes [3] - в другой.
Первое число - b"'\x10" - апостроф также является байтом, просто замененным его представлением в формате ascii, а второе число - b"\x00\x00". Итак, по 16 бит каждый. Предполагая обратный порядок байтов, эти два числа были 10000 и 0. Используя их, вы должны получить точный массив байтов, как указано выше, с кодом, который у вас уже есть.






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