0

I want to display an ASCII table of the characters from 32 to 127 (decimal), but instead of the decimal numbers I want it to display the hexadecimal ones with the according characters next to them so it can look like this:

20     21 !   22 "   23 #   24 $   25 %   26 &   27 '   28 (   29 )   2a *   2b +   2c ,   2d -   2e .   2f /   
30 0   31 1   32 2   33 3   34 4   35 5   36 6   37 7   38 8   39 9   3a :   3b ;   3c <   3d =   3e >   3f ?   
40 @   41 A   42 B   43 C   44 D   45 E   46 F   47 G   48 H   49 I   4a J   4b K   4c L   4d M   4e N   4f O   
50 P   51 Q   52 R   53 S   54 T   55 U   56 V   57 W   58 X   59 Y   5a Z   5b [   5c \   5d ]   5e ^   5f _   
60 `   61 a   62 b   63 c   64 d   65 e   66 f   67 g   68 h   69 i   6a j   6b k   6c l   6d m   6e n   6f o   
70 p   71 q   72 r   73 s   74 t   75 u   76 v   77 w   78 x   79 y   7a z   7b {   7c |   7d }   7e ~   

I need to use a 'for-loop' for this and have 16 characters per row as shown above.

So far I have this as a code, but it prints out the decimal numbers and I don't know how to make it print out the hexadecimal ones, also I don't know how to make the characters stay next to the hexadecimal ones and not above them:

for i in range(32, 127, 16):

   for characters in range(i, i+16):
      print('%5s'%chr(characters), end="")
   print()

   for decimal in range(i, i+16):
      print('%5s'%decimal, end="")
   print()

4 Answers 4

2

You can change the format specification; change the s to x (or X if you want uppercase letters in the hexadecimal numbers).

That is

print('%5x' % decimal, end="")
Sign up to request clarification or add additional context in comments.

Comments

1

Use %x:

for i in range(32, 127, 16):

   for characters in range(i, i+16):
      print('%2x %-4s'%(characters, chr(characters)) , end="")
   print()

1 Comment

Thanks! That's exactly what I was looking for.
1

You can also use the new style formatting

>>> '{:x} {:<4}'.format(65, chr(65))
'41 A    '

If you uncouple generating the strings from printing you get a little more readable code.

from itertools import islice
# cell generator
cells = (f"{i:x} {chr(i):<4}" for i in range(32, 127))

# cell printer
for _ in range(32, 127, 16):
    # for every row print the next 16 cells
    print(*islice(cells, 0, 16))

Comments

1

I suggest using the f-string syntax.

for i in range(32, 127, 16):
    for characters in range(i, i+16):
        print(f"{characters:2x} {chr(characters):<4}", end="")
    print()

2 Comments

ValueError:Sign not allowed in string format specifier, I think you mean `chr(characters):<4}"
@steviestickman I didn't know that ! thanks for correcting me I edited my answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.