Najkrótszy program zrzutu heksów

13

Wyzwanie

Utwórz program konsoli, aby wyświetlić każdy bajt pliku.


Zwycięski

Ponieważ jest to , wygrywa najmniej bajtów.


Zasady

  • Program musi być aplikacją konsolową , co oznacza, że ​​będzie uruchamiany z jakiegoś interpretera wiersza poleceń;
  • Każdy bajt musi być wielkimi literami szesnastkowymi, oddzielonymi spacją i musi składać się z 2 cyfr; (wstaw cyfrę 0, jeśli ma 1 cyfrę)
  • Plik musi być odczytany przy użyciu IO lub alternatywnie i nie może być zakodowany na stałe;
  • Ścieżka do pliku musi być określona jako argument wiersza polecenia lub monit użytkownika (np. STDIN) ;
  • Brak luki podobać ;

Przykład

test.txt (kończy się na LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
facepalm42
źródło
16
@ facepalm42 Aby uniknąć twarzy, zdecydowanie zalecamy korzystanie z piaskownicy, aby pomóc w projektowaniu przyszłych wyzwań przed ich opublikowaniem.
Adám
2
Jak można wyświetlić wszystkie wartości bajtów jednocześnie, jeśli nie zmieści się na ekranie? Przewijanie wyraźnie nie jest „naraz”. Co jest nie tak z funkcją zwracającą wartości (funkcja)?
Adám
7
@ facepalm42 Nie zmieniaj specyfikacji tak długo po opublikowaniu wyzwania. Oryginalny post nie określał dokładnego formatu liczb szesnastkowych, pozostawiając to autorom odpowiedzi. Twoja ostatnia edycja unieważniła moją istniejącą odpowiedź!
Adám
11
Czy istnieje konkretny powód, dla którego dopuszczasz tylko argument wiersza polecenia lub monit użytkownika? Co jest złego w na przykład traktowaniu nazwy pliku jako argumentu funkcji?
Adám
3
Byłoby pomocne, gdybyś miał prosty hello.txtplik tekstowy jako przykład jako dane wejściowe i jakie powinno być oczekiwane wyjście. Na przykład, jeśli hello.txtzawiera po prostu słowo helloz podziałem wiersza, jak wyraziłoby się to w wyniku? Czy grupujesz bajty w słowa 16-bitowe, 32-bitowe lub 64-bitowe? A może każdy bajt jest wyrażony jako dwucyfrowa liczba szesnastkowa? Czy spacje są akceptowane po każdym bajcie jako szesnastkowym, czy po każdym słowie x-bitowym? Czy potrzebujesz 0xwstępnej poprawki dla każdego bajtu?
Shaun Bebbers

Odpowiedzi:

11

C (gcc) na * nix, 73 71 bajtów

i;main(c,v)int**v;{for(c=open(v[1],0);read(c,&i,1);printf("%02X ",i));}

Wypróbuj online! Zestaw testowy

-2 bajty dzięki Johan du Toit

To zależy O_RDONLY == 0od tego, int_one == 1gdzie i gdzie int int_one; *(char*)&int_one = 1;.

pustkowie
źródło
11
69 bajtów ;)
Johan du Toit,
6

Rubinowy , 26 bajtów

$<.bytes{|b|$><<"%02X "%b}

Wypróbuj online!

GB
źródło
Czy to czyta zawartość pliku, podając ścieżkę pliku jako argument programu? Na podstawie TIO wydaje się po prostu czytać ze STDIN, ale nie znam Ruby wystarczająco dobrze, by stwierdzić, że jest niepoprawny.
Kevin Cruijssen
1
@KevinCruijssen Tak, przyjmuje ścieżki pliku jako argument programu. Jeśli nie ma argumentów, $<zamiast tego przełącza się na odczyt ze STDIN.
Wartość tuszu
6

Java 11, 156 154 bajtów

import java.nio.file.*;interface M{static void main(String[]a)throws Exception{for(int b:Files.readAllBytes(Path.of(a[0])))System.out.printf("%02X ",b);}}

-2 bajty dzięki @Holger .

Wypróbuj online , używając ./.input.tiojako argumentu ścieżki do pliku, która będzie miała dane wejściowe jako zawartość pliku.

Wyjaśnienie:

import java.nio.file.*;        // Required import for Files and Paths
interface M{                   // Class
  static void main(String[]a)  //  Mandatory main method
      throws Exception{        //  With mandatory thrown clause for the readAllBytes builtin
                                         a[0]    // Get the first argument
                                 Path.of(    )   // Get the file using that argument as path
              Files.readAllBytes(             )  // Get all bytes from this file
    for(int b:                                 ) // Loop over each of them:
      System.out.printf(                         //  And print the current byte
                        "%02X ",b);}}            //  As uppercase hexadecimal with leading 0
                                                 //  and trailing space as delimiter
Kevin Cruijssen
źródło
Jakie jest uzasadnienie używania interfacezamiast class?
JakeDot,
4
@JakeDot main musi być publiczny, metody interfejsu są zawsze publiczne, interfacejest krótszy niż class+ public.
Grimmy,
3
W Javie 11 możesz używać Path.ofzamiastPaths.get
Holger
1
@Holger Thanks! :)
Kevin Cruijssen
2
@Grimy od Java 9, metody interfejsu nie zawsze są public, ale nie są publicjawne private.
Holger,
6

PHP , 60 59 54 bajtów

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 bajt dzięki manassehkatz
  • -5 bajtów dzięki Blackhole

Wypróbuj online!

Jan
źródło
1
Powinien być w stanie upuścić końcowy ?>i zapisać 2 bajty, a jeśli to nie zadziała, zastąp ?>średnikiem i zapisz 1 bajt.
manassehkatz-Moving 2 Codidact
2
Użyj implode(file($x))zamiast file_get_contents($x)(-4 bajtów).
Blackhole
2
I wordwrap(), 1jako jako ostatni parametr, jest o jeden bajt krótszy niż chunk_split().
Blackhole
5

Perl 5 (-aF// ), 23 bajty

printf"%02X ",ord for@F

TIO

Nahuel Fouilleul
źródło
4

APL (Dyalog Unicode) , 16 bajtów

Anonimowa ukryta funkcja prefiksu. Zwraca (i domyślnie drukuje, jeśli wartość nie zostanie w inny sposób zużyta), macierz dwurzędową z 4 górnymi bitami przedstawionymi jako liczba dziesiętna 0–15 w górnym rzędzie i 4 dolne bity podobnie reprezentowane w dolnym rzędzie. Oznacza to, że macierz ma tyle kolumn, ile plik ma bajtów.

16 1683 ¯1∘⎕MAP

Wypróbuj online!

⎕MAP zamapuj nazwę pliku argumentu na tablicę
 z parametrami:
¯1 cała długość pliku
83 odczytywana jako 8-bitowe liczby całkowite

16 16⊤ konwertuj (anty-bazowy) na szesnastkowy 2-położeniowy

Adám
źródło
1
@ facepalm42 To bardzo dużo w systemie szesnastkowym. Np. H72, czyli 4 × 16¹ + 8 × 16⁰ lub [4,8] ₁₆. W związku z tym w pierwszej kolumnie w przykładzie odczytuje [4,8].
Adám
Och, zupełnie zapomniałem! Przepraszam.
facepalm42
4

Python 3, 59 bajtów

-11 bajtów dzięki przeważnie nieszkodliwemu!

-8 bajtów dzięki Jamesowi K Polkowi!

-24 bajty dzięki Blue!

print(' '.join('%02X'%ord(i)for i in open(input()).read()))

Wypróbuj online!

To jest całkiem proste; otwiera nazwę pliku podaną jako dane wejściowe na STDIN, czyta ją, konwertuje każdy znak na jego wartość ASCII, konwertuje każdą liczbę na szesnastkową, oddziela tę, "0x"która poprzedza wartości szesnastkowe w Pythonie, w razie potrzeby uzupełnia wartość zerową, a następnie łączy wartości wraz ze spacjami.

mprogrammer
źródło
Można zaoszczędzić kilka bajtów '%02X'%ord(i)zamiast przekrawać dane wyjściowe heksadecymalne
większości nieszkodliwe
@MostlyHarmless Done! -11 bajtów. Dzięki!
mprogrammer
co powiesz na „% 02X” zamiast „% 02x” i pozbądź się .upper()
Prezydent James Moveon Polk
Możesz zapisać bajty z import sys, używając raw_input()zamiast tego nazwy pliku; Reguły zezwalają na monitowanie użytkownika.
Blue
@Blue Thanks! Jest jeszcze krótszy w Pythonie 3, gdzie możesz to zrobićinput()
mprogrammer
3

Bash ,  33  23 bajty

... z dużą pomocą:
-3 dzięki manatwork
-4 dzięki spuck
-3 dzięki Nahuel Fouilleul

echo `xxd -c1 -p -u $1`

Wypróbuj online!

Należy zauważyć, że związek TIO powyżej wejścia zastosowań - możemy zapisywać pliki lokalnie, więc tym pokazuje, że pracuje jako programu biorąc ścieżkę do pliku.

Jonathan Allan
źródło
Niewielkie redukcje: xxd -u -p $1|fold -2|tr \\n \ .
manatwork
Dzięki, masz pomysł, jak zdobyć \ni \ pracować w „tej” wersji linku? EDYCJA: Dodałem kolejną postać ucieczki.
Jonathan Allan
Jeśli dobrze cię rozumiem, po prostu chcesz zmienić podwójne cudzysłowy na pojedyncze: Wypróbuj online!
manatwork
Wspaniale! Dziękuję!
Jonathan Allan
xxd -c1 -p -u $1|tr \\n \
spuck
3

Kotlin , 130 127 104 93 92 bajty

fun main(a:Array<String>){java.io.File(a[0]).readBytes().forEach{print("%02X ".format(it))}}

Wypróbuj online!

Edycja: -11 bajtów dzięki @ChrisParton

Edycja: działające TIO

Edycja: -1 bajt dzięki @KevinCruijssen

Quinn
źródło
1
Mógłbyś rowu import i odniesienie Filejako java.io.Filezamiast?
Chris Parton,
@ChrisParton masz rację, dzięki!
Quinn,
Oto działające TIO. Możesz użyć ./.input.tiojako argumentu ścieżki do pliku, a on użyje STDIN jako zawartości pliku. :)
Kevin Cruijssen,
@KevinCruijssen dzięki! właśnie zaktualizowana odpowiedź
Quinn,
1
Nie znam Kotlina, ale TIO nadal działa, jeśli usunę miejsce w a:Array, więc myślę, że możesz zapisać bajt.
Kevin Cruijssen
2

Dart , 140 134 bajtów

import'dart:io';main(a){print(new File(a[0]).readAsBytesSync().map((n)=>n.toRadixString(16).toUpperCase().padLeft(2,'0')).join(' '));}

Wypróbuj online!

-6 bajtów, ponieważ zapomniałem zredukować nazwy zmiennych

Elcan
źródło
+1 za rzutkę. Taki niedoceniany język.
vasilescur
Trudno grać w golfa, ponieważ jest to w zasadzie JS bez bardzo
luźnego
2

Haskell, 145 143 bajtów

import System.Environment
import Text.Printf
import Data.ByteString
main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
Damien
źródło
1
Troszkę krótszy: import Data.ByteStringplus main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi
2

Rdza, 141 bajtów (wersja przekazana)

use std::{io::*,fs::*,env::*};fn main(){for x in File::open(args().nth(1).unwrap()).unwrap().bytes(){print!("{:02X} ",x.unwrap())}println!()}

Rdza, 151 bajtów (wersja oryginalna)

fn main(){std::io::Read::bytes(std::fs::File::open(std::env::args().nth(1).unwrap()).unwrap()).map(|x|print!("{:02X} ",x.unwrap())).count();println!()}
Vi.
źródło
-10 bajtów: TIO
Herman L
2

bash + Stax, 6 + 4 + 1 = 11 bajtów

W tym momencie jest to kompletna jednostka teoretyczna. Nie możesz tego uruchomić. Jeśli wszystko działa zgodnie ze specyfikacją, działałoby, ale jeszcze nie wszystko.

Skrypt bash jest

]<$1

i program stax musi zostać skompilowany i zapisany w] is

╛↕ßú┼_

Ustaw swój zestaw znaków na ISO 8859-1 (Windows-1252 nie będzie tu działał) i idź

Rozpakowano i wyjaśniono

_          push all input as a single array
F          run the rest of the program for each element of the array
 |H        write the hex of the byte to standard output
 |         write a space to standard output
Jozuego
źródło
2

Emojicode , 186 162 bajtów

📦files🏠🏁🍇🔂b🍺📇🐇📄🆕🔡👂🏼❗️❗️🍇👄📫🍪🔪🔡🔢b❗️➕256 16❗️1 2❗️🔤 🔤🍪❗️❗️🍉🍉

Wypróbuj online tutaj.

Nie golfowany:

📦 files 🏠  💭 Import the files package into the default namespace
🏁 🍇  💭 Main code block
🔂 b  💭 For each b in ...
  🍺  💭 (ignoring IO errors)
  📇 🐇 📄  💭 ... the byte representation of the file ...
  🆕 🔡 👂🏼  💭 ... read from user input:
  ❗️ ❗️ 🍇
    👄  💭 Print ...
    📫  💭 ... in upper case (numbers in bases > 10 are in lower case) ...
    🍪  💭 ... the concatenation of:
      🔪 🔡 🔢 b ❗️ ➕ 256  💭 b + 256 (this gives the leading zero in case the hex representation of b is a single digit) ...
              16  💭 ... represented in hexadecimal ...
           ❗️
         1 2  💭 ... without the leading one,
      ❗️
      🔤 🔤  💭 ... and a space
    🍪
    ❗️❗️
  🍉
🍉
OOBalance
źródło
2

Perl 6 , 45 bajtów

@*ARGS[0].IO.slurp(:bin).list.fmt('%02X').say

Wypróbuj online!

  • @*ARGS[0] jest pierwszym argumentem wiersza poleceń.
  • .IOzamienia tę (przypuszczalnie) nazwę pliku w IO::Pathobiekt.
  • .slurp(:bin)wczytuje cały plik do Bufbufora bajtów. (Bez :binzawartości plik byłby zwracany jako ciąg Unicode.)
  • .list zwraca listę wartości bajtów z bufora.
  • .fmt('%02X')to Listmetoda, która formatuje elementy listy przy użyciu podanego ciągu formatu, a następnie łączy je spacjami. (Wygodna!)
  • .say wypisuje ten ciąg.
Sean
źródło
Na podstawie odpowiedzi w języku Python łącze TIO jest w rzeczywistości całkiem możliwe.
Draco18s nie ufa już SE
Niektóre Zmiana układu można usunąć .listdo 41 bajtów
Jo królowi
1

D , 98 bajtów

import std;void main(string[]s){File(s[1]).byChunk(9).joiner.each!(a=>writef("%02X ",a.to!byte));}

Wypróbuj online!

Samuel
źródło
1

Python 3, 75 bajtów

Przeważnie kopia odpowiedzi Maxona na python 2.

import sys
print(' '.join('%02X'%b for b in open(sys.argv[1],'rb').read()))
Prezydent James Moveon Polk
źródło
masz na myśli prawdopodobnie sys.argv[1]. z sys.argv[0]tym skryptem działa bardziej jak quine ;-)
anion
@anion: ups, haha, naprawianie ...
Prezydent James Moveon Polk
1

Rakieta, 144 bajty

To przesłanie generuje końcowe miejsce i brak końcowego nowego wiersza. Daj mi znać, jeśli uważa się to za lukę :)

(command-line #:args(f)(for([b(call-with-input-file f port->bytes)])(printf"~a "(string-upcase(~r b #:base 16 #:min-width 2 #:pad-string"0")))))

Oczyszczone

(command-line #:args (f)
 (for ([b (call-with-input-file f port->bytes)])
   (printf "~a "
           (string-upcase
            (~r b #:base 16 #:min-width 2 #:pad-string "0")))))
Winny
źródło
1

Dalej (gforth) , 71 bajtów

: f slurp-file hex 0 do dup c@ 0 <# # # #> type space 1+ loop ;
1 arg f

Wypróbuj online!

TIO znajduje się 3 argw ostatnim wierszu, ponieważ TIO przekazuje „-e pa” do parsera wiersza poleceń przed przekazaniem kodu

Objaśnienie kodu

: f             \ start a function definition
  slurp-file    \ open the file indicated by the string on top of the stack,
                \ then put its contents  in a new string on top of the stack
  hex           \ set the interpreter to base 16
  0 do          \ loop from 0 to file-length - 1 (inclusive)
    dup c@      \ get the character value from the address on top of the stack
    0 <# # # #> \ convert to a double-length number then convert to a string of length 2
    type        \ output the created string 
    space       \ output a space 
    1+          \ add 1 to the current address value
  loop          \ end the loop
;               \ end the word definition
1 arg f         \ get the filename from the first command-line argument and call the function
reffu
źródło
1

JavaScript, 155 bajtów

for(b=WScript,a=new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(b.Arguments(0));;b.echo(('0'+a.read(1).charCodeAt(0).toString(16)).slice(-2)))
Peter Ferrie
źródło
1

VBScript, 143 bajty

set a=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)):while 1 WScript.echo(right("0"+Hex(Asc(a.read(1))),2)):wend
Peter Ferrie
źródło
1

Wolfram Language (Mathematica) , 94 89 bajtów

Print@ToUpperCase@StringRiffle@IntegerString[BinaryReadList@Last@$ScriptCommandLine,16,2]

Wypróbuj online!

Kod jest dość zrozumiały ze względu na długie nazwy poleceń. Należy go czytać głównie od prawej do lewej:

$ScriptCommandLine       is a list of {scriptname, commandlinearg1, commandlinearg2, ...}
Last@...                 extracts the last command-line argument
BinaryReadList@...       reads the named file into a list of bytes
IntegerString[...,16,2]  converts each byte to a 2-digit hex string (lowercase)
StringRiffle@...         converts this list of strings into a single string with spaces
ToUpperCase@...          converts the string to uppercase
Print@...                prints the result to stdout
rzymski
źródło
1

Gema , 45 znaków

?=@fill-right{00;@radix{10;16;@char-int{?}}} 

Przykładowy przebieg:

bash-5.0$ gema '?=@fill-right{00;@radix{10;16;@char-int{?}}} ' <<< 'Hello World!'
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A 

Wypróbuj online!

człowiek w pracy
źródło
1

Pyth , 12 bajtów

jdcr1.Hjb'w2

Wypróbuj online!

Pobiera dane wejściowe jako monit użytkownika (nie ma możliwości uzyskania dostępu do argumentów wiersza polecenia AFAIK).

jd           # join on spaces
  c        2 # chop into pieces of length 2
   r1        # convert to uppercase
     .H      # convert to hex string, interpreting as base 256 (*)
       jb    # join on newlines
         '   # read file as list of lines
          w  # input()

(*) Nie jestem w 100% pewien, czy jest to zamierzone, ale jedna podstawowa 256 cyfra (jak w, jeden znak) zawsze zamieni się na dokładnie 2 cyfry szesnastkowe, eliminując potrzebę wypełniania zerami.

ar4093
źródło
1

Node.js, 118 bajtów

console.log([...require("fs").readFileSync(process.argv[2])].map(y=>(y<16?0:"")+y.toString(16).toUpperCase()).join` `)

Jak wygląda wynik: wprowadź opis zdjęcia tutaj

Btw zawartość test.txtw przykładzie jest następująca:

做乜嘢要輸出大楷姐,搞到要加番toUpperCase()去轉番,咁就13byte啦。

(Dlaczego, u licha, potrzeba dużych liter. Musiałem dodać konwersję z toUpperCase(), a to kosztowało 13 bajtów.)

Shieru Asakoto
źródło
0

C # .NET Framework 4.7.2 - 235 213 203 191 175 140 bajtów

Wypróbuj online!

using System.IO;class P{static void Main(string[]a){foreach(var b in File.ReadAllBytes(a[0])){System.Console.Write(b.ToString("X2")+" ");}}}

using System;
using System.IO;

namespace hexdump
{
    class Program
    {
        static void Main(string[] args)
        {
            // Read the bytes of the file
            byte[] bytes = File.ReadAllBytes(args[0]);

            // Loop through all the bytes and show them
            foreach (byte b in bytes)
            {
                // Show the byte converted to hexadecimal
                Console.Write(b.ToString("X2") + " ");
            }
        }
    }
}
facepalm42
źródło
1
Myślę, że poniższe zapisują niektóre bajty (myślę, że teraz 181): użycie System.IO; klasa P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (zmienna b File.ReadAllBytes (A [0])) {System.Console.Write ($ "{b.ToString (" x2" )} „);}}}}
PmanAce
@PmanAce Jeśli usuniesz trochę białych znaków, liczba spadnie do 175.
facepalm42
0

05AB1E , 18 bajtów

IvyÇh2j' 0.:' Jvy?

Wypróbuj online!

Wyjaśnienie:

IvyÇh2j' 0.:' Jvy?
Iv                 Loop through each character in input
  y                Push current character
   Ç               ASCII value
    h              Convert to hexadecimal
     2j            Pad with at least 2 spaces
       ' 0.:       Replace all spaces with 0s
            ' J    Add space to end
               vy? Convert to string and print
IvyÇh2j' 0.:' Jvy?
facepalm42
źródło