Sometimes it is useful to view the first N bytes of a file without reading
the whole file. The file might be much too large to load into a text
editor or a Leo node, for example. The Linux command *head* will show you
just the start of a file, but Windows doesn't have that command out of the
box. Often it's better to look at the hex bytes rather than the text,
especially if the file is binary. Say, for example, that you want to see
if a file is a zip file or not, or if the EXIF data is embedded in a .jpg
picture file.
Here is a Leo command that loads a file using the file dialog. It creates
a new node at the end of your outline and fills it with a classic hex view
of the first 4096 bytes.
I have this script as an *@command* node in my myLeoSettings.leo file, and
I also have a custom menu item for it. I don't use it all the time but
it's invaluable when it is needed.
Here is the script:
"""Display as hex the first 4096 bytes of a file in body of a new node."""
data = ''
def format_bytes(bytes):
"""Format byte data into classic hex bytes display."""
text = ''
asc = ' ' * 3 # For translation of bytes to ascii characters
n = 0
for i, b in enumerate(bytes):
text += f'{b:02x}'
asc += chr(b) if b > 0x1F else '.'
if i > 0 and i % 10 == 9:
# Complete the current line
text += asc
text += '\n'
asc = ' ' * 3
n += 1
if n % 8 == 0:
# Insert a blank line for readability
text += '\n'
else:
text += ' '
return text
filetypes = [('Any', '*.*'),]
path = g.app.gui.runOpenFileDialog(c, 'Choose File To Sample',
filetypes=filetypes)
g.es(path)
if path:
try:
with open(path, 'rb') as f:
data = f.read(4096)
except IOError as e:
g.es(e)
if data:
# Create and select target node
p_last = c.lastVisible()
target = p_last.insertAfter()
target.h = f'first bytes of {path}'
target.b = f'{format_bytes(data)}'
target.setDirty()
c.selectPosition(target)
while c.canMoveOutlineLeft():
c.moveOutlineLeft()
c.redraw()
Here is (just the first part) of the bytes of an image file of mine. We
can see the signature of a .jpg file. and that it uses the *sRGB* color map.
ff d8 ff e0 00 10 4a 46 49 46 ÿØÿà..JFIF
00 01 01 00 00 01 00 01 00 00 ..........
ff e2 0c 58 49 43 43 5f 50 52 ÿâ.XICC_PR
4f 46 49 4c 45 00 01 01 00 00 OFILE.....
0c 48 6c 63 6d 73 02 10 00 00 .Hlcms....
6d 6e 74 72 52 47 42 20 58 59 mntrRGB XY
5a 20 07 ce 00 02 00 09 00 06 Z .Î......
00 31 00 00 61 63 73 70 4d 53 .1..acspMS
46 54 00 00 00 00 49 45 43 20 FT....IEC
73 52 47 42 00 00 00 00 00 00 sRGB......
00 00 00 00 00 00 00 00 f6 d6 ........öÖ
00 01 00 00 00 00 d3 2d 6c 63 ......Ó-lc
6d 73 00 00 00 00 00 00 00 00 ms........
00 00 00 00 00 00 00 00 00 00 ..........
00 00 00 00 00 00 00 00 00 00 ..........
00 00 00 00 00 00 00 00 00 00 ..........
--
You received this message because you are subscribed to the Google Groups
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/leo-editor/e50dd9cf-2015-4345-8c31-7a0d0bddcba9n%40googlegroups.com.