2014-11-18 2 views
0

У меня есть bytes.Как добавить к байтам в python 3

b'\x01\x02\x03' 

И int в диапазоне 0..255.

5 

Теперь я хочу, чтобы присоединить int к bytes, как это:

b'\x01\x02\x03\x05' 

Как это сделать? Существует не append метод в bytes. Я даже не знаю, как сделать целое число одним байтом.

>>> bytes(5) 
b'\x00\x00\x00\x00\x00' 

ответ

10

bytes является неизменным. Используйте bytearray.

xs = bytearray(b'\x01\x02\x03') 
xs.append(5) 
+0

Обратите внимание, что 'bytearray' может хранить только целые числа в диапазоне 0-256. Хотя в этом случае OP касается только того же диапазона. :-) –

+1

'bytearray' имеет метод' .extend' для добавления большего количества байтов одновременно, например 'xs.extend (b '\ x11 \ x22 \ x33')'. – pepr

3

Прежде всего проходит целое число (скажем n) для bytes() просто возвращает байт строку n длины с нулевыми байтами. Таким образом, это не то, что вы хотите здесь:

Либо вы можете сделать:

>>> bytes([5]) #This will work only for range 0-256. 
b'\x05' 

Или:

>>> bytes(chr(5), 'ascii') 
b'\x05' 

Как @simonzack уже упоминалось, что байты неизменны, поэтому для обновления (или лучше повторите назначение новой строки), ее значение необходимо использовать оператору +=.

>>> s = b'\x01\x02\x03' 
>>> s += bytes([5])  #or s = s + bytes([5]) 
>>> s 
b'\x01\x02\x03\x05' 

>>> s = b'\x01\x02\x03' 
>>> s += bytes(chr(5), 'ascii') ##or s = s + bytes(chr(5), 'ascii') 
>>> s 
b'\x01\x02\x03\x05' 

Помощь по bytes():

>>> print(bytes.__doc__) 
bytes(iterable_of_ints) -> bytes 
bytes(string, encoding[, errors]) -> bytes 
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 
bytes(int) -> bytes object of size given by the parameter initialized with null bytes 
bytes() -> empty bytes object 

Construct an immutable array of bytes from: 
    - an iterable yielding integers in range(256) 
    - a text string encoded using the specified encoding 
    - any object implementing the buffer API. 
    - an integer 

Или пойти на изменяемом bytearray, если вам нужен изменяемый объект, и вы беспокоитесь только с целыми числами в диапазоне 0-256.

Смежные вопросы