[HN Gopher] Hexyl: A command-line hex viewer with colorized output
       ___________________________________________________________________
        
       Hexyl: A command-line hex viewer with colorized output
        
       Author : hundredwatt
       Score  : 122 points
       Date   : 2023-06-16 16:56 UTC (6 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | dang wrote:
       | Related:
       | 
       |  _Hexyl: A command-line hex viewer_ -
       | https://news.ycombinator.com/item?id=18865264 - Jan 2019 (113
       | comments)
        
       | crabbone wrote:
       | Why would you need a _separate_ binary viewer  / editor?
       | 
       | This reminds me the absurd, but somehow common situation where
       | Java programmers in my office used IntelliJ IDEA to write Java,
       | but Notepad++ to view logs or edit INI files etc.
        
         | anamexis wrote:
         | Separate from what?
        
         | sitzkrieg wrote:
         | i do this. big heavy ide with project and debugger going full
         | blast. I might want to just pop open a log quickly and cba to
         | drag it into the IDE, np++ context menu done. more often tho,
         | reading logs on a non-main dev machine/vm/test/field
        
       | Conscat wrote:
       | Hexyl is what I love to use for quickly looking at a file. For
       | slightly more serious introspection I use Emacs' hexl-mode, which
       | also has basic editing capabilities.
        
       | jbaber wrote:
       | Hexyl's lovely and I copied its style for a hex editor.
       | 
       | I don't understand why there are so many terminal hex viewers
       | that don't edit.
        
         | jmholla wrote:
         | What's your hex editor?
        
           | seanw444 wrote:
           | I'd also like to know.
        
       | CodeWriter23 wrote:
       | When I was coming up, we didn't have no dashed lines dividing the
       | displays into 8-byte segments. And color? Everything was orange
       | text on black. If you wanted green on black, you used a
       | coworker's terminal.
        
         | naikrovek wrote:
         | That's nice.
        
       | some_random wrote:
       | I love hexyl, but the colorized output does get in the way
       | sometimes when I'm copying out bytes
        
         | Pr0ject217 wrote:
         | Just out of curiosity (as I haven't needed to use a hex
         | viewer/editor in web dev) - what use-cases are you using this
         | for?
        
           | some_random wrote:
           | Reverse engineering!
        
             | Pr0ject217 wrote:
             | That sounds fun ;)
             | 
             | Was there a first project you did that got you hooked?
        
               | some_random wrote:
               | Game hacking for sure, and it's still a blast. Playing
               | around with variables in cheat engine or messing with
               | save files is a fantastic way to get started as long as
               | you stick to single player games (multiplayer cheating is
               | way harder and usually unethical).
               | 
               | https://cheatengine.org/
        
       | camel-cdr wrote:
       | Does it handle files larger than memory? I've been using dhex for
       | that purpose.
        
         | jandrese wrote:
         | When you're only dumping a file memory use shouldn't be an
         | issue. It is the hex editors that run into memory problems.
        
           | camel-cdr wrote:
           | Ah, sorry, I didn't understand what this is for.
        
       | WalterBright wrote:
       | Here's mine, from 1986 or so. I still use it all the time:
       | #include <stdio.h>         #define O1O printf         #define OlO
       | putchar         #define O10 exit         #define Ol0 strlen
       | #define QLQ fopen         #define OlQ fgetc         #define O1Q
       | abs         #define QO0 for         typedef char lOL;
       | lOL*QI[] = {"Use:\012\011dump file\012","Unable to open file
       | '\x25s'\012",          "\012","   ",""};              main(I,Il)
       | lOL*Il[];         {   FILE *L;                 unsigned lO;
       | int Q,OL[' '^'0'],llO = EOF,
       | O=1,l=0,lll=O+O+O+l,OQ=056;                 lOL*llL="%2x ";
       | (I != 1<<1&&(O1O(QI[0]),O10(1011-1010))),                 ((L =
       | QLQ(Il[O],"r"))==0&&(O1O(QI[O],Il[O]),O10(O)));
       | lO = I-(O<<l<<O);                 while (L-l,1)                 {
       | QO0(Q = 0L;((Q &~(0x10-O))== l);
       | OL[Q++] = OlQ(L));                         if (OL[0]==llO) break;
       | O1O("\0454x: ",lO);                         if (I == (1<<1))
       | {   QO0(Q=Ol0(QI[O<<O<<1]);Q<Ol0(QI[0]);
       | Q++)O1O((OL[Q]!=llO)?llL:QI[lll],OL[Q]);/*"
       | O10(QI[1O])*/                                 O1O(QI[lll]);{}
       | }                         QO0 (Q=0L;Q<1<<1<<1<<1<<1;Q+=Q<0100)
       | {   (OL[Q]!=llO)? /* 0010 10lOQ 000LQL */
       | ((D(OL[Q])==0&&(*(OL+O1Q(Q-l))=OQ)),
       | OlO(OL[Q])):
       | OlO(1<<(1<<1<<1)<<1);                         }
       | O1O(QI[01^10^9]);                         lO+=Q+0+l;}
       | }                 D(l) { return l>=' '&&l<='\~';         }
       | 
       | I do like the colorized output of hexyl, though.
        
         | cornstalks wrote:
         | Was this for an obfuscated C challenge?
        
           | pmoriarty wrote:
           | Here's how Claude+[1] explained it:
           | 
           | This program appears to be a hexadecimal dump utility. It
           | does the following:
           | 
           | - It takes a filename as a command line argument and opens
           | that file for reading
           | 
           | - It reads the file byte by byte until EOF
           | 
           | - For each byte, it prints the hexadecimal value of the byte,
           | in the format "%2x " (i.e. 2 hex digits, a space)
           | 
           | - After every 16 bytes, it prints the ASCII representation of
           | those bytes, replacing non-printable characters with "."
           | 
           | - It also has some obfuscated logic with bitwise operations,
           | likely attempting to confuse the reader.
           | 
           | So if you ran it like this:                 ./program
           | myfile.txt
           | 
           | It would output something like:                 54 65 78 74
           | 20 66 69        6c 65 2e 0a 54 68 69        73 20 69 73 20 61
           | 20        74 65 78 74 20 66 69        6c 65 2e 0a 54 68 65
           | 20 71 75 69 63 6b 20        62 72 6f 77 6e 20 66         6f
           | 78 0a 6a 75 6d 70        73 20 6f 76 65 72 20       20 74 68
           | 65 20 6c 61       7a 79 20 64 6f 67 0a        2e 2e 2e
           | 
           | Which is the hexadecimal dump of the ASCII contents of
           | myfile.txt.
           | 
           | The #defines are used to obfuscate the code and make it
           | harder to read, replacing printf with O1O, putchar with OlO,
           | etc. The D() function is used to check if a byte is a
           | printable ASCII character.
           | 
           | So in summary, this program opens a file, reads it byte by
           | byte, prints the hex values, and prints the ASCII for
           | printable characters, as a hexadecimal dump utility.
           | 
           | [1] - https://poe.com/Claude%2B
        
             | cornstalks wrote:
             | I'm well aware of how the code works. I was mostly
             | interested in _why_ it was written like that. nwiswell 's
             | comment[1] gave me the hint I needed to find that yes, this
             | was part of an obfuscated C challenge[2].
             | 
             | I know you mean well but LLMs are the very last resource
             | I'd turn to for help. Those things make crap up all the
             | time.
             | 
             | [1]: https://news.ycombinator.com/item?id=36364283
             | 
             | [2]: https://www.ioccc.org/1986/bright/bright.c
        
             | WalterBright wrote:
             | > likely attempting to confuse the reader
             | 
             | It's just ordinary C code.
        
               | throwaway675309 wrote:
               | Very obviously not.
               | 
               | Nobody substitutes random three letter strings for
               | keywords in _ordinary C code_ unless they intend on some
               | trivial obfuscation.                   define O1O printf
               | #define OlO putchar         #define O10 exit
               | #define Ol0 strlen         #define QLQ fopen
               | #define OlQ fgetc         #define O1Q abs         #define
               | QO0 for         typedef char lOL;
        
             | pmoriarty wrote:
             | After seeing an LLM do something like this, I've got to ask
             | people who think that LLMs are just "stochastic parrots",
             | "just predicting the next word", or are merely "a blurry
             | jpeg of the web" to think about what's really going on
             | here.
        
               | TheCleric wrote:
               | It didn't even answer the question though...
        
               | nwiswell wrote:
               | This exact code appears online as part of the IOCCC 1986
               | (it was a submission), so it's likely that this was
               | indeed part of the training set for this LLM and that
               | there is a significant corpus of text discussing this
               | particular program and other obfuscated programs like it.
               | 
               | I'm not ruling out that this LLM output is "partially
               | organic" rather than "fully regurgitated", but I'd be
               | much more interested to see this LLM explain an
               | obfuscated program that hasn't been floating around the
               | Internet for 35 years.
        
               | pmoriarty wrote:
               | It's easy to test it with something unpublished
        
       | faitswulff wrote:
       | Sharkdp is also responsible for some fantastic tools like
       | hyperfine for micro benchmarking, fd for finding files, bat which
       | is a colorized cat replacement and many more such utilities.
       | https://github.com/sharkdp is a real treasure trove of user-
       | friendly CLI tools.
        
         | 29athrowaway wrote:
         | burntsushi and sharkdp are the goats.
        
           | TacticalCoder wrote:
           | And both are members of HN!
        
       | fuzztester wrote:
       | I've used the XVI32 hex editor for Windows in the past.
       | 
       | Written in Delphi.
       | 
       | Split pane.
       | 
       | Useful app. Free.
        
         | [deleted]
        
         | fuzztester wrote:
         | Get it here:
         | 
         | http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.h...
         | 
         | Just looked at it again.
         | 
         | Has a lot of good features and positive comments.
         | 
         | Including, "even used by Microsoft".
        
       | [deleted]
        
       | denysvitali wrote:
       | If you want a true Hex Editor (or better, Hex IDE), I strongly
       | suggest you to take a look ad ImHex [1].
       | 
       | [1]: https://github.com/WerWolv/ImHex
        
       | chx wrote:
       | Strongly related: is there a hex viewer where I can set ,
       | preferably on-the-fly or with a command line switch record
       | delimiters so it colors the records?
        
         | naikrovek wrote:
         | how many different record separators do you have?
         | 
         | ImHex may be useful to you if you only have a few. You can
         | write a pattern file which parses the whole file and displays
         | everything, if you want.
        
       | stusmall wrote:
       | I really like this tool for quick, easy debugging on binary
       | files. okteta used to be my go to, but it's rare I need editing.
       | I'm usually just take a quick look at the contents.
        
       | BlackLotus89 wrote:
       | Was looking at hexdump alternatives a week ago and between
       | huxdemp (hxd), xxd, hx, hd (not the alias for hexdump -C) and
       | hexdump this was my favourite.
       | 
       | hx wasn't usable when parsing data streams... And clashes with
       | helix (hx)
       | 
       | On systems where I can't install anything I would just use
       | hexdump -C or xxd
        
         | denysvitali wrote:
         | I've created an xxd clone called xd:
         | https://github.com/denysvitali/hexutils
         | 
         | It just uses the same visualization but highlights the ASCII
         | chars
        
       ___________________________________________________________________
       (page generated 2023-06-16 23:00 UTC)