Program pembuangan hex terpendek

13

Tantangan

Buat program konsol untuk menampilkan setiap byte file.


Kemenangan

Karena ini adalah , byte paling sedikit menang.


Aturan

  • Program harus berupa aplikasi konsol , artinya akan dijalankan dari semacam juru bahasa command-line;
  • Setiap byte harus berbentuk heksadesimal, dipisahkan oleh spasi, dan harus 2 digit; (cantumkan angka 0 sebelum itu jika memiliki 1 digit)
  • File harus dibaca menggunakan IO atau alternatif, dan bukan kode-keras;
  • Jalur file harus ditentukan sebagai argumen baris perintah atau prompt pengguna (seperti STDIN) ;
  • Tolong , jangan ada celah ;

Contoh

test.txt (diakhiri dengan LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
facepalm42
sumber
16
@ facepalm42 Untuk menghindari facepalms, saya sangat merekomendasikan menggunakan Sandbox untuk membantu Anda merancang tantangan di masa depan sebelum mempostingnya.
Adám
2
Bagaimana mungkin menampilkan semua nilai byte sekaligus, jika tidak muat di layar? Menggulir dengan jelas bukan "sekaligus". Juga, apa yang salah dengan (fungsi) yang hanya mengembalikan nilai?
Adám
7
@ facepalm42 Mohon jangan mengubah spek begitu lama setelah memposting tantangan. Posting asli tidak menentukan format persis angka heksadesimal, menyerahkannya kepada penjawab. Suntingan terakhir Anda membatalkan jawaban saya yang ada!
Adám
11
Apakah ada alasan tertentu Anda hanya mengizinkan argumen baris perintah atau prompt pengguna? Apa yang salah dengan mis mengambil nama file sebagai argumen fungsi?
Adám
3
Akan sangat membantu jika Anda memiliki hello.txtfile teks sederhana sebagai contoh sebagai input dan seperti apa output yang diharapkan. Sebagai contoh, jika kata yang hello.txtterkandung hanya berisi hellosatu baris, bagaimana ini akan diekspresikan dalam output? Apakah Anda mengelompokkan byte dalam kata 16-bit, 32-bit atau 64-bit? Atau apakah setiap byte dinyatakan sebagai hex dua digit? Apakah spasi dapat diterima setelah setiap byte sebagai hex, atau setelah setiap kata x-bit? Apakah Anda memerlukan 0xpra-perbaikan untuk setiap byte?
Shaun Bebbers

Jawaban:

11

C (gcc) pada * nix, 73 71 byte

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

Cobalah online! Suite uji

-2 byte berkat Johan du Toit

Ini bergantung pada O_RDONLY == 0dan di int_one == 1mana int int_one; *(char*)&int_one = 1;.

wastl
sumber
11
69 Bytes ;)
Johan du Toit
6

Ruby , 26 byte

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

Cobalah online!

GB
sumber
Apakah ini membaca isi file yang diberikan path file sebagai argumen program? Berdasarkan TIO sepertinya hanya membaca dari STDIN, tapi saya tidak tahu Ruby cukup baik untuk mengatakan itu tidak benar.
Kevin Cruijssen
1
@KevinCruijssen Ya, dibutuhkan path file sebagai argumen program. Jika tidak ada argumen, $<alih-alih beralih ke membaca dari STDIN.
Nilai Tinta
6

Java 11, 156 154 byte

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 byte terima kasih kepada @ Holger .

Cobalah online dengan menggunakan ./.input.tiopath file argumen, yang akan memiliki input yang diberikan sebagai file-konten.

Penjelasan:

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
sumber
Apa alasan di balik menggunakan interfacebukan class?
JakeDot
4
@JakeDot utama diperlukan untuk umum, metode antarmuka selalu publik, interfacelebih pendek dari class+ public.
Grimmy
3
Dengan Java 11, Anda dapat menggunakan Path.ofsebagai gantinyaPaths.get
Holger
1
@ Holger Terima kasih! :)
Kevin Cruijssen
2
@ Grimy sejak Java 9, metode antarmuka tidak selalu public, tetapi mereka publicdinyatakan secara eksplisit private.
Holger
6

PHP , 60 59 54 byte

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 byte terima kasih kepada manassehkatz
  • -5 byte berkat Blackhole

Cobalah online!

John
sumber
1
Seharusnya bisa menghapus trailing ?>dan menyimpan 2 byte, atau jika itu tidak berhasil maka ganti ?>dengan titik koma dan simpan 1 byte.
manassehkatz-Moving 2 Codidact
2
Gunakan implode(file($x))sebagai ganti file_get_contents($x)(-4 bytes).
Lubang Hitam
2
Dan wordwrap(), dengan 1sebagai parameter terakhir, satu byte lebih pendek dari chunk_split().
Lubang Hitam
5

Perl 5 ( -aF//), 23 byte

printf"%02X ",ord for@F

TIO

Nahuel Fouilleul
sumber
4

APL (Dyalog Unicode) , 16 byte

Fungsi awalan diam-diam anonim. Mengembalikan (dan secara implisit mencetak, jika nilainya tidak digunakan) matriks dua baris dengan 4 bit teratas direpresentasikan sebagai angka desimal 0–15 di baris atas dan 4 bit terbawah sama diwakili di baris bawah. Artinya, matriks memiliki kolom sebanyak file memiliki byte.

16 1683 ¯1∘⎕MAP

Cobalah online!

⎕MAP memetakan nama file argumen ke array
 dengan parameter:
¯1 seluruh panjang file
83 dibaca sebagai bilangan bulat 8-bit

16 16⊤ convert (anti-base) menjadi 2-posisi hexadecimal

Adm
sumber
1
@ facepalm42 Sangat banyak dalam heksadesimal. Misalnya Hadalah 72, yaitu 4 × 16¹ + 8 × 16⁰ atau [4,8] ₁₆. Karenanya kolom pertama dalam contoh berbunyi [4,8].
Adám
Oh, aku benar-benar lupa! Maaf.
facepalm42
4

Python 3, 59 byte

-11 byte, terima kasih kepada Mostly Harmless!

-8 Bytes berkat James K Polk!

-24 byte terima kasih kepada Blue!

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

Cobalah online!

Ini sangat mudah; itu membuka nama file yang diberikan sebagai input pada STDIN, membacanya, mengubah setiap karakter ke nilai ASCII-nya, mengubah setiap angka menjadi hex, menghapus semua "0x"yang mendahului nilai hexademical dengan Python, membungkus nilai dengan nol jika perlu, kemudian bergabung dengan nilai-nilai bersama dengan spasi.

mprogrammer
sumber
Dapat menghemat beberapa byte dengan '%02X'%ord(i)bukannya memotong output hex
Mostly Harmless
@MostlyHarmless Done! -11 byte. Terima kasih!
mprogrammer
bagaimana dengan '% 02X' alih-alih '% 02x', dan singkirkan.upper()
Presiden James Moveon Polk
Anda dapat menyimpan byte dari import sysmenggunakan raw_input()sebagai nama file sebagai gantinya; aturan memungkinkan pengguna meminta.
Biru
@Biru Terima kasih! Dan itu bahkan lebih pendek di Python 3, di mana Anda bisa melakukannyainput()
mprogrammer
3

Bash ,  33  23 byte

... dengan banyak bantuan:
-3 berkat manatwork
-4 berkat spuck
-3 berkat Nahuel Fouilleul

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

Cobalah online!

Perhatikan bahwa tautan TIO di atas menggunakan input - kita dapat menulis file secara lokal, jadi ini menunjukkan itu berfungsi sebagai program yang mengambil jalur file.

Jonathan Allan
sumber
Pengurangan minor: xxd -u -p $1|fold -2|tr \\n \ .
manatwork
Terima kasih, ada ide bagaimana cara mendapatkan \ndan \ bekerja di versi tautan 'ini'? EDIT: Saya menambahkan karakter pelarian lain.
Jonathan Allan
Jika saya memahami Anda dengan benar, Anda hanya ingin mengubah dari tanda kutip ganda menjadi tanda kutip tunggal: Coba online!
manatwork
Luarbiasa, terimakasih!
Jonathan Allan
xxd -c1 -p -u $1|tr \\n \
menjilat
3

Kotlin , 130 127 104 93 92 byte

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

Cobalah online!

Edit: -11 byte terima kasih kepada @ChrisParton

Edit: Bekerja TIO

Sunting: -1 byte terima kasih kepada @KevinCruijssen

Quinn
sumber
1
Bisakah Anda membuang impor dan referensi Filesebagai java.io.Filegantinya?
Chris Parton
@ ChrisParton benar, terima kasih!
Quinn
Di sini TIO yang berfungsi. Anda dapat menggunakan ./.input.tiosebagai argumen jalur file, dan itu akan menggunakan STDIN sebagai konten file. :)
Kevin Cruijssen
@KevinCruijssen terima kasih! baru saja memperbarui jawaban
Quinn
1
Saya tidak tahu Kotlin, tetapi TIO masih berfungsi jika saya menghapus spasi di a:Array, jadi saya pikir Anda dapat menghemat satu byte.
Kevin Cruijssen
2

Dart , 140 134 byte

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

Cobalah online!

-6 byte karena saya lupa mengurangi nama variabel

Elcan
sumber
+1 untuk panah. Bahasa yang diremehkan.
vasilescur
Sulit bermain golf, karena pada dasarnya JS tanpa sistem tipe yang sangat longgar
Elcan
2

Haskell, 145 143 byte

import System.Environment
import Text.Printf
import Data.ByteString
main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
Damien
sumber
1
Sedikit lebih pendek: import Data.ByteStringplus main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi
2

Rust, 141 byte (versi kontribusi)

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

Rust, 151 byte (versi asli)

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.
sumber
-10 byte: TIO
Herman L
2

bash + Stax, 6 + 4 + 1 = 11 byte

Ini adalah teori kerajinan lengkap pada saat ini. Anda tidak dapat benar-benar menjalankan ini. Jika semuanya bekerja sesuai dengan spesifikasinya, ini akan berhasil, tetapi belum semuanya belum.

Skrip bash adalah

]<$1

dan program stax harus dikompilasi dan disimpan ke] is

╛↕ßú┼_

Setel karakter Anda ke ISO 8859-1 (Windows-1252 tidak akan berfungsi di sini) dan lanjutkan

Dibongkar dan dijelaskan

_          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
Joshua
sumber
2

Emojicode , 186 162 byte

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

Cobalah online di sini.

Tidak Disatukan:

📦 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
    🍪
    ❗️❗️
  🍉
🍉
Ketidakseimbangan
sumber
2

Perl 6 , 45 byte

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

Cobalah online!

  • @*ARGS[0] adalah argumen baris perintah pertama.
  • .IOmengubah nama file (yang diduga) menjadi IO::Pathobjek.
  • .slurp(:bin)membaca seluruh file menjadi Bufbuffer byte. (Tanpa :binisi file akan dikembalikan sebagai string Unicode.)
  • .list mengembalikan daftar nilai byte dari buffer.
  • .fmt('%02X')adalah Listmetode yang memformat elemen daftar menggunakan string format yang diberikan, kemudian bergabung dengan spasi. (Mudah!)
  • .say mencetak string itu.
Sean
sumber
Berdasarkan jawaban Python, TIO Link sebenarnya sangat mungkin.
Draco18 tidak lagi mempercayai
Beberapa penataan ulang dapat menghapus .listuntuk 41 byte
Jo King
1

D , 98 Bytes

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

Cobalah secara Online!

Samuel
sumber
1

Python 3, 75 byte

Sebagian besar salinan jawaban python Maxwell 2.

import sys
print(' '.join('%02X'%b for b in open(sys.argv[1],'rb').read()))
Presiden James Moveon Polk
sumber
maksudmu mungkin sys.argv[1]. dengan sys.argv[0]skrip ini berfungsi lebih seperti quine ;-)
anion
@anion: oops, haha, memperbaiki ...
Presiden James Moveon Polk
1

Racket, 144 byte

Kiriman ini menghasilkan spasi tambahan, dan tidak ada tambahan baris baru. Beritahu saya jika ini dianggap sebagai celah :)

(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")))))

Dibersihkan

(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
sumber
1

Keempat (gforth) , 71 byte

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

Cobalah online!

TIO memiliki 3 argdi baris terakhir karena TIO melewati "-e bye" ke parser baris perintah sebelum melewati kode

Penjelasan Kode

: 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
sumber
1

Javascript, 155 byte

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
sumber
1

VBScript, 143 byte

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

Bahasa Wolfram (Mathematica) , 94 89 byte

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

Cobalah online!

Kode ini cukup jelas karena nama perintah yang panjang. Itu harus dibaca sebagian besar dari kanan ke kiri:

$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
Roma
sumber
1

Gema , 45 karakter

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

Contoh dijalankan:

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 

Cobalah online!

manatwork
sumber
1

Pyth , 12 byte

jdcr1.Hjb'w2

Cobalah online!

Mengambil input sebagai prompt pengguna (tidak ada cara untuk mengakses argumen baris perintah 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()

(*) Saya tidak 100% yakin apakah ini dimaksudkan, tetapi satu basis 256 digit (seperti dalam, satu karakter), akan selalu dikonversi menjadi tepat 2 digit hex, menghilangkan kebutuhan untuk mengisi dengan nol.

ar4093
sumber
1

Node.js, 118 byte

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

Seperti apa hasilnya: masukkan deskripsi gambar di sini

Btw konten test.txtdalam contoh adalah sebagai berikut:

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

(Mengapa output huruf besar diperlukan. Saya harus menambahkan konversi toUpperCase(), dan biayanya 13 byte.)

Shieru Asakoto
sumber
0

C # .NET Framework 4.7.2 - 235 213 203 191 175 140 byte

Cobalah 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
sumber
1
Saya pikir yang berikut ini akan menghemat beberapa byte (sekarang 181 saya pikir): menggunakan System.IO; class P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (var b dalam File.ReadAllBytes (a [0])) {System.Console.Write ($ "{b.ToString (" X2 ")}");}}}}
PmanAce
@PmanAce Jika Anda menghapus sebagian spasi, itu turun ke 175.
facepalm42
0

05AB1E , 18 byte

IvyÇh2j' 0.:' Jvy?

Cobalah online!

Penjelasan:

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
sumber