чтение байтов буквально на питоне - PullRequest
1 голос
/ 04 ноября 2019

Я читаю три байта из файла в Python, байты в шестнадцатеричном формате точные значения байтов \ x00 \ x07 \ x71

, но когда я читаю эти байты с использованием метода fp.read, python преобразует последниебайт в q

Есть ли способ избежать преобразования, когда python читает байты в ASCII и буквально читает значение байта

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Судя по комментариям, вам нужно преобразовать произвольное количество байтов в одно целое число. Поэтому \x00\x07\x71 следует рассматривать как одно двоичное число. Если вы хотите написать свою собственную функцию (что не так уж сложно), вы можете перебирать каждый байт и сдвигать его бит соответственно в зависимости от его позиции.

Для вашего примера a = b"\x00\x07\x71" это расширяетсяна двоичное число a_b = 0b00000000_00000111_01110001. Начнем с самого правого байта. Это не должно быть сдвигом битов вообще - мы добавляем это к результату. Переходим ко 2-му байту (\x07). Это нужно сдвинуть влево на 1 байт, а затем добавить к результату. Наконец, самый левый байт должен быть сдвинут влево на 2 байта и затем добавлен к результату. Таким образом, наш от руки расчет дает (113 + 7 * 2 ^ 8 + 0 * 2 ^ 16 = 113 + 1792 + 0 = 1905)

def b_concat(bs):
  """
  Performs binary concatenation of an arbitrary number of 8-bit values.
  b_concat stands for binary-concatenation.

  Input:
    bs: bytes - A bytes string to convert to a single integer

  Returns: The concatenated result as an integer. See examples below
  """
  result = 0
  n = len(bs)
  for i in range(n):
    result += (bs[n - i - 1] << (8*i)) # or you can use bs[::-1][i]
  return result

tests = [b"\x00", b"\x01", b"\x02", b"\x00\x01", b"\x14\xa2", b"\x00\x07\x71"]
for test in tests:
  print(f"{test} --> {b_concat(test)}")

или 1-лайнер, если вы предпочитаете

def b_concat(bs):
    return sum([bs[::-1][i] << (8*i) for i in range(len(bs))])

В любом случае, вывод будет

b'\x00' --> 0
b'\x01' --> 1
b'\x02' --> 2
b'\x00\x01' --> 1
b'\x14\xa2' --> 5282
b'\x00\x07q' --> 1905
0 голосов
/ 04 ноября 2019

Я нашел решение, которое я использую binascii.b2a_hex, чтобы преобразовать двоичные значения в их шестнадцатеричное представление, и использую int (convert_val, 16), чтобы получить целочисленное значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...