Convert string to ASCII value python
Question:
How would you convert a string to ASCII values?
For example, "hi" would return [104 105]
.
I can individually do ord(‘h’) and ord(‘i’), but it’s going to be troublesome when there are a lot of letters.
Answers:
You can use a list comprehension:
>>> s = 'hi'
>>> [ord(c) for c in s]
[104, 105]
If you want your result concatenated, as you show in your question, you could try something like:
>>> reduce(lambda x, y: str(x)+str(y), map(ord,"hello world"))
'10410110810811132119111114108100'
Here is a pretty concise way to perform the concatenation:
>>> s = "hello world"
>>> ''.join(str(ord(c)) for c in s)
'10410110810811132119111114108100'
And a sort of fun alternative:
>>> '%d'*len(s) % tuple(map(ord, s))
'10410110810811132119111114108100'
It is not at all obvious why one would want to concatenate the (decimal) “ascii values”. What is certain is that concatenating them without leading zeroes (or some other padding or a delimiter) is useless — nothing can be reliably recovered from such an output.
>>> tests = ["hi", "Hi", "HI", 'x0Ax29x00x05']
>>> ["".join("%d" % ord(c) for c in s) for s in tests]
['104105', '72105', '7273', '104105']
Note that the first 3 outputs are of different length. Note that the fourth result is the same as the first.
>>> ["".join("%03d" % ord(c) for c in s) for s in tests]
['104105', '072105', '072073', '010041000005']
>>> [" ".join("%d" % ord(c) for c in s) for s in tests]
['104 105', '72 105', '72 73', '10 41 0 5']
>>> ["".join("%02x" % ord(c) for c in s) for s in tests]
['6869', '4869', '4849', '0a290005']
>>>
Note no such problems.
def stringToNumbers(ord(message)):
return stringToNumbers
stringToNumbers.append = (ord[0])
stringToNumbers = ("morocco")
your description is rather confusing; directly concatenating the decimal values doesn’t seem useful in most contexts. the following code will cast each letter to an 8-bit character, and THEN concatenate. this is how standard ASCII encoding works
def ASCII(s):
x = 0
for i in xrange(len(s)):
x += ord(s[i])*2**(8 * (len(s) - i - 1))
return x
If you are using python 3 or above,
>>> list(bytes(b'test'))
[116, 101, 115, 116]
you can actually do it with numpy:
import numpy as np
a = np.fromstring('hi', dtype=np.uint8)
print(a)
In 2021 we can assume only Python 3 is relevant, so…
If your input is bytes
:
>>> list(b"Hello")
[72, 101, 108, 108, 111]
If your input is str
:
>>> list("Hello".encode('ascii'))
[72, 101, 108, 108, 111]
If you want a single solution that works with both:
list(bytes(text, 'ascii'))
(all the above will intentionally raise UnicodeEncodeError
if str
contains non-ASCII chars. A fair assumption as it makes no sense to ask for the "ASCII value" of non-ASCII chars.)
How would you convert a string to ASCII values?
For example, "hi" would return [104 105]
.
I can individually do ord(‘h’) and ord(‘i’), but it’s going to be troublesome when there are a lot of letters.
You can use a list comprehension:
>>> s = 'hi'
>>> [ord(c) for c in s]
[104, 105]
If you want your result concatenated, as you show in your question, you could try something like:
>>> reduce(lambda x, y: str(x)+str(y), map(ord,"hello world"))
'10410110810811132119111114108100'
Here is a pretty concise way to perform the concatenation:
>>> s = "hello world"
>>> ''.join(str(ord(c)) for c in s)
'10410110810811132119111114108100'
And a sort of fun alternative:
>>> '%d'*len(s) % tuple(map(ord, s))
'10410110810811132119111114108100'
It is not at all obvious why one would want to concatenate the (decimal) “ascii values”. What is certain is that concatenating them without leading zeroes (or some other padding or a delimiter) is useless — nothing can be reliably recovered from such an output.
>>> tests = ["hi", "Hi", "HI", 'x0Ax29x00x05']
>>> ["".join("%d" % ord(c) for c in s) for s in tests]
['104105', '72105', '7273', '104105']
Note that the first 3 outputs are of different length. Note that the fourth result is the same as the first.
>>> ["".join("%03d" % ord(c) for c in s) for s in tests]
['104105', '072105', '072073', '010041000005']
>>> [" ".join("%d" % ord(c) for c in s) for s in tests]
['104 105', '72 105', '72 73', '10 41 0 5']
>>> ["".join("%02x" % ord(c) for c in s) for s in tests]
['6869', '4869', '4849', '0a290005']
>>>
Note no such problems.
def stringToNumbers(ord(message)):
return stringToNumbers
stringToNumbers.append = (ord[0])
stringToNumbers = ("morocco")
your description is rather confusing; directly concatenating the decimal values doesn’t seem useful in most contexts. the following code will cast each letter to an 8-bit character, and THEN concatenate. this is how standard ASCII encoding works
def ASCII(s):
x = 0
for i in xrange(len(s)):
x += ord(s[i])*2**(8 * (len(s) - i - 1))
return x
If you are using python 3 or above,
>>> list(bytes(b'test'))
[116, 101, 115, 116]
you can actually do it with numpy:
import numpy as np
a = np.fromstring('hi', dtype=np.uint8)
print(a)
In 2021 we can assume only Python 3 is relevant, so…
If your input is bytes
:
>>> list(b"Hello")
[72, 101, 108, 108, 111]
If your input is str
:
>>> list("Hello".encode('ascii'))
[72, 101, 108, 108, 111]
If you want a single solution that works with both:
list(bytes(text, 'ascii'))
(all the above will intentionally raise UnicodeEncodeError
if str
contains non-ASCII chars. A fair assumption as it makes no sense to ask for the "ASCII value" of non-ASCII chars.)