How to turn a binary string into a byte?
up vote
1
down vote
favorite
If I take the letter 'à' and encode it in UTF-8 I obtain the following result:
'à'.encode('utf-8')
>> b'xc3xa0'
Now from a bytearray I would like to convert 'à' into a binary string and turn it back into 'à'. To do so I execute the following code:
byte = bytearray('à','utf-8')
for x in byte:
print(bin(x))
I get 0b11000011
and0b10100000
, which is 195 and 160. Then, I fuse them together and take the 0b
part out. Now I execute this code:
s = '1100001110100000'
value1 = s[0:8].encode('utf-8')
value2 = s[9:16].encode('utf-8')
value = value1 + value2
print(chr(int(value, 2)))
>> 憠
No matter how I develop the later part I get symbols and never seem to be able to get back my 'à'. I would like to know why is that? And how can I get an 'à'.
python unicode utf-8 utf
add a comment |
up vote
1
down vote
favorite
If I take the letter 'à' and encode it in UTF-8 I obtain the following result:
'à'.encode('utf-8')
>> b'xc3xa0'
Now from a bytearray I would like to convert 'à' into a binary string and turn it back into 'à'. To do so I execute the following code:
byte = bytearray('à','utf-8')
for x in byte:
print(bin(x))
I get 0b11000011
and0b10100000
, which is 195 and 160. Then, I fuse them together and take the 0b
part out. Now I execute this code:
s = '1100001110100000'
value1 = s[0:8].encode('utf-8')
value2 = s[9:16].encode('utf-8')
value = value1 + value2
print(chr(int(value, 2)))
>> 憠
No matter how I develop the later part I get symbols and never seem to be able to get back my 'à'. I would like to know why is that? And how can I get an 'à'.
python unicode utf-8 utf
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
If I take the letter 'à' and encode it in UTF-8 I obtain the following result:
'à'.encode('utf-8')
>> b'xc3xa0'
Now from a bytearray I would like to convert 'à' into a binary string and turn it back into 'à'. To do so I execute the following code:
byte = bytearray('à','utf-8')
for x in byte:
print(bin(x))
I get 0b11000011
and0b10100000
, which is 195 and 160. Then, I fuse them together and take the 0b
part out. Now I execute this code:
s = '1100001110100000'
value1 = s[0:8].encode('utf-8')
value2 = s[9:16].encode('utf-8')
value = value1 + value2
print(chr(int(value, 2)))
>> 憠
No matter how I develop the later part I get symbols and never seem to be able to get back my 'à'. I would like to know why is that? And how can I get an 'à'.
python unicode utf-8 utf
If I take the letter 'à' and encode it in UTF-8 I obtain the following result:
'à'.encode('utf-8')
>> b'xc3xa0'
Now from a bytearray I would like to convert 'à' into a binary string and turn it back into 'à'. To do so I execute the following code:
byte = bytearray('à','utf-8')
for x in byte:
print(bin(x))
I get 0b11000011
and0b10100000
, which is 195 and 160. Then, I fuse them together and take the 0b
part out. Now I execute this code:
s = '1100001110100000'
value1 = s[0:8].encode('utf-8')
value2 = s[9:16].encode('utf-8')
value = value1 + value2
print(chr(int(value, 2)))
>> 憠
No matter how I develop the later part I get symbols and never seem to be able to get back my 'à'. I would like to know why is that? And how can I get an 'à'.
python unicode utf-8 utf
python unicode utf-8 utf
asked Nov 21 at 23:44
jatrp5
142
142
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
up vote
3
down vote
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'
There are multiple parts to this. The bytes
constructor creates a byte string from a sequence of integers. The integers are formed from strings using int
with a base of 2. The range
combined with the slicing peels off 8 characters at a time. Finally decode
converts those bytes back into Unicode characters.
1
Note also that the OP can use''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using:08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.
– torek
Nov 22 at 0:03
add a comment |
up vote
0
down vote
you need your second bits to be s[8:16]
(or just s[8:]
) otherwise you get 0100000
you also need to convert you "bit string" back to an integer before thinking of it as a byte with int("0010101",2)
s = '1100001110100000'
value1 = bytearray([int(s[:8],2), # bits 0..7 (8 total)
int(s[8:],2)] # bits 8..15 (8 total)
)
print(value1.decode("utf8"))
add a comment |
up vote
0
down vote
Convert the base-2 value back to an integer with int(s,2)
, convert that integer to a number of bytes (int.to_bytes
) based on the original length divided by 8 and big-endian conversion to keep the bytes in the right order, then .decode()
it (default in Python 3 is utf8
):
>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'xc3xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'
There are multiple parts to this. The bytes
constructor creates a byte string from a sequence of integers. The integers are formed from strings using int
with a base of 2. The range
combined with the slicing peels off 8 characters at a time. Finally decode
converts those bytes back into Unicode characters.
1
Note also that the OP can use''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using:08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.
– torek
Nov 22 at 0:03
add a comment |
up vote
3
down vote
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'
There are multiple parts to this. The bytes
constructor creates a byte string from a sequence of integers. The integers are formed from strings using int
with a base of 2. The range
combined with the slicing peels off 8 characters at a time. Finally decode
converts those bytes back into Unicode characters.
1
Note also that the OP can use''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using:08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.
– torek
Nov 22 at 0:03
add a comment |
up vote
3
down vote
up vote
3
down vote
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'
There are multiple parts to this. The bytes
constructor creates a byte string from a sequence of integers. The integers are formed from strings using int
with a base of 2. The range
combined with the slicing peels off 8 characters at a time. Finally decode
converts those bytes back into Unicode characters.
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'
There are multiple parts to this. The bytes
constructor creates a byte string from a sequence of integers. The integers are formed from strings using int
with a base of 2. The range
combined with the slicing peels off 8 characters at a time. Finally decode
converts those bytes back into Unicode characters.
answered Nov 21 at 23:50
Mark Ransom
221k29275503
221k29275503
1
Note also that the OP can use''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using:08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.
– torek
Nov 22 at 0:03
add a comment |
1
Note also that the OP can use''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using:08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.
– torek
Nov 22 at 0:03
1
1
Note also that the OP can use
''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using :08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.– torek
Nov 22 at 0:03
Note also that the OP can use
''.join('{:08b}'.format(i) for i in byte)
on the original byte-array object. This is pretty similar: we take the byte-array apart, one byte at a time, and format each one using :08b
to get an eight-bit zero-filled string representation, then join all the strings without whitespace.– torek
Nov 22 at 0:03
add a comment |
up vote
0
down vote
you need your second bits to be s[8:16]
(or just s[8:]
) otherwise you get 0100000
you also need to convert you "bit string" back to an integer before thinking of it as a byte with int("0010101",2)
s = '1100001110100000'
value1 = bytearray([int(s[:8],2), # bits 0..7 (8 total)
int(s[8:],2)] # bits 8..15 (8 total)
)
print(value1.decode("utf8"))
add a comment |
up vote
0
down vote
you need your second bits to be s[8:16]
(or just s[8:]
) otherwise you get 0100000
you also need to convert you "bit string" back to an integer before thinking of it as a byte with int("0010101",2)
s = '1100001110100000'
value1 = bytearray([int(s[:8],2), # bits 0..7 (8 total)
int(s[8:],2)] # bits 8..15 (8 total)
)
print(value1.decode("utf8"))
add a comment |
up vote
0
down vote
up vote
0
down vote
you need your second bits to be s[8:16]
(or just s[8:]
) otherwise you get 0100000
you also need to convert you "bit string" back to an integer before thinking of it as a byte with int("0010101",2)
s = '1100001110100000'
value1 = bytearray([int(s[:8],2), # bits 0..7 (8 total)
int(s[8:],2)] # bits 8..15 (8 total)
)
print(value1.decode("utf8"))
you need your second bits to be s[8:16]
(or just s[8:]
) otherwise you get 0100000
you also need to convert you "bit string" back to an integer before thinking of it as a byte with int("0010101",2)
s = '1100001110100000'
value1 = bytearray([int(s[:8],2), # bits 0..7 (8 total)
int(s[8:],2)] # bits 8..15 (8 total)
)
print(value1.decode("utf8"))
answered Nov 21 at 23:51
Joran Beasley
71.8k676116
71.8k676116
add a comment |
add a comment |
up vote
0
down vote
Convert the base-2 value back to an integer with int(s,2)
, convert that integer to a number of bytes (int.to_bytes
) based on the original length divided by 8 and big-endian conversion to keep the bytes in the right order, then .decode()
it (default in Python 3 is utf8
):
>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'xc3xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'
add a comment |
up vote
0
down vote
Convert the base-2 value back to an integer with int(s,2)
, convert that integer to a number of bytes (int.to_bytes
) based on the original length divided by 8 and big-endian conversion to keep the bytes in the right order, then .decode()
it (default in Python 3 is utf8
):
>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'xc3xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'
add a comment |
up vote
0
down vote
up vote
0
down vote
Convert the base-2 value back to an integer with int(s,2)
, convert that integer to a number of bytes (int.to_bytes
) based on the original length divided by 8 and big-endian conversion to keep the bytes in the right order, then .decode()
it (default in Python 3 is utf8
):
>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'xc3xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'
Convert the base-2 value back to an integer with int(s,2)
, convert that integer to a number of bytes (int.to_bytes
) based on the original length divided by 8 and big-endian conversion to keep the bytes in the right order, then .decode()
it (default in Python 3 is utf8
):
>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'xc3xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'
answered Nov 22 at 7:29
Mark Tolonen
89.7k12107175
89.7k12107175
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53422008%2fhow-to-turn-a-binary-string-into-a-byte%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown