Кратчайшая программа шестнадцатеричного дампа

13

Вызов

Создайте консольную программу для отображения каждого байта файла.


выигрыш

Поскольку это , побеждает меньше байтов.


правила

  • Программа должна быть консольным приложением , что означает, что она будет запускаться из своего рода интерпретатора командной строки;
  • Каждый байт должен быть шестнадцатеричным в верхнем регистре, разделенным пробелом, и это должно быть 2 цифры; (поставьте число 0 перед ним, если оно имеет 1 цифру)
  • Файл должен быть прочитан с использованием ввода-вывода или альтернативы, а не жестко закодирован;
  • Путь к файлу должен быть указан как аргумент командной строки или приглашение пользователя (например, STDIN) ;
  • Не бойтесь, пожалуйста ;

пример

test.txt (заканчивается LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
facepalm42
источник
16
@ facepalm42 Чтобы избежать использования лицевых панелей, я настоятельно рекомендую использовать Песочницу, чтобы помочь вам спроектировать будущие задачи перед их публикацией.
Адам
2
Как можно отобразить все байтовые значения одновременно, если они не помещаются на экране? Прокрутка явно не "сразу". Кроме того, что не так с (функцией), просто возвращающей значения?
Адам
7
@ facepalm42 Пожалуйста, не меняйте спецификацию так долго после публикации заявки. Оригинальный пост не указал точный формат шестнадцатеричных чисел, оставляя его на усмотрение ответчиков. Ваше последнее изменение лишило законной силы мой существующий ответ!
Адам
11
Есть ли конкретная причина, по которой вы разрешаете только аргумент командной строки или приглашение пользователя? Что не так, например, с принятием имени файла в качестве аргумента функции?
Адам
3
Было бы полезно , если бы у вас был простой hello.txtтекстовый файл в качестве примера в качестве входных и то , что ожидаемый результат должен быть. Например, если в нем hello.txtсодержится просто слово helloс разрывом строки, как это будет выражено в выводе? Вы группируете байты в 16-битные, 32-битные или 64-битные слова? Или каждый байт выражается в виде двузначного шестнадцатеричного числа? Допустимы ли пробелы после каждого байта в шестнадцатеричном виде или после каждого x-битного слова? Требуется ли 0xпредварительное исправление для каждого байта?
Шон Бебберс

Ответы:

6

Рубин , 26 байт

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

Попробуйте онлайн!

гигабайт
источник
Читает ли это содержимое файла, заданного путем к файлу в качестве аргумента программы? Основываясь на TIO, он, кажется, просто читает из STDIN, но я недостаточно хорошо знаю Ruby, чтобы сказать, что это неправильно.
Кевин Круйссен
1
@KevinCruijssen Да, в качестве аргумента программы используются пути к файлам. Если аргументов нет, $<вместо этого переключается на чтение из STDIN.
Value Ink
6

Java 11, 156 154 байта

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 байта благодаря @Holger .

Попробуйте онлайн , используя в ./.input.tioкачестве аргумента путь к файлу, который будет иметь заданный вход в качестве файла-содержимого.

Объяснение:

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
Кевин Круйссен
источник
В чем причина использования interfaceвместо class?
JakeDot
4
@JakeDot main должен быть общедоступным, методы интерфейса всегда общедоступны, interfaceкороче class+ public.
Grimmy
3
С Java 11 вы можете использовать Path.ofвместоPaths.get
Хольгер
1
@ Холгер Спасибо! :)
Кевин Круйссен
2
@Grimy начиная с Java 9, методы интерфейса не всегда public, но они publicобъявлены явно private.
Хольгер
6

PHP , 60 59 54 байта

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 байт благодаря manassehkatz
  • -5 байт благодаря Blackhole

Попробуйте онлайн!

Джон
источник
1
Должна быть возможность отбросить завершающий символ ?>и сохранить 2 байта, или, если это не сработает, заменить ?>точку с запятой и сохранить 1 байт.
Manassehkatz-Moving 2 Codidact
2
Используйте implode(file($x))вместо file_get_contents($x)(-4 байта).
Blackhole
2
И wordwrap(), 1в качестве последнего параметра, на один байт короче, чем chunk_split().
Blackhole
5

Perl 5 ( -aF//), 23 байта

printf"%02X ",ord for@F

TIO

Науэль Фуйе
источник
4

APL (Dyalog Unicode) , 16 байтов

Функция анонимного молчаливого префикса. Возвращает (и неявно печатает, если значение не используется иным образом) матрицу из двух строк, где верхние 4 бита представлены в виде десятичного числа 0–15 в верхней строке, а нижние 4 бита аналогично представлены в нижней строке. То есть в матрице столько столбцов, сколько в файле байтов.

16 1683 ¯1∘⎕MAP

Попробуйте онлайн!

⎕MAP сопоставить имя файла аргумента с массивом
 с параметрами:
¯1 вся длина файла
83 читается как 8-битные целые числа

16 16⊤ конвертировать (анти-основание) в шестнадцатеричное 2-х позиционное

Адам
источник
1
@ facepalm42 Это очень много в шестнадцатеричном. Например H, 72, что составляет 4 × 16¹ + 8 × 16⁰ или [4,8] ₁₆. Таким образом, первый столбец в примере читает [4,8].
Адам
О, я совсем забыл! Сожалею.
facepalm42
4

Python 3, 59 байт

-11 байтов благодаря Mostly Harmless!

-8 байт благодаря Джеймсу К Полку!

-24 байта благодаря Blue!

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

Попробуйте онлайн!

Это довольно просто; он открывает имя файла, заданное в качестве ввода в STDIN, читает его, преобразует каждый символ в его значение ASCII, преобразует каждое число в шестнадцатеричное, удаляет "0x"предшествующее шестнадцатеричным значениям в Python, дополняет значение нулем, если необходимо, затем соединяет значения вместе с пробелами.

mprogrammer
источник
Можно сэкономить несколько байтов '%02X'%ord(i)вместо того, чтобы разрезать вывод гекса
Mostly Harmless
@MostlyHarmless Готово! -11 байт. Благодарность!
mprogrammer
как насчет «% 02X» вместо «% 02x» и избавиться от него.upper()
президент Джеймс Мовеон Полк,
Вы можете сохранить байты из import sys, используя raw_input()вместо этого имя файла; правила позволяют пользователю подсказывать.
Синий
@ Синий Спасибо! И это еще короче в Python 3, где вы можете просто сделатьinput()
mprogrammer
3

Баш ,  33  23 байта

... с большой помощью:
-3 благодаря искусству работы
-4 благодаря spuck
-3 благодаря Науэлю Фуйе

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

Попробуйте онлайн!

Обратите внимание, что ссылка TIO выше использует ввод - мы можем записывать файлы локально, так что это показывает, что она работает как программа, использующая путь к файлу.

Джонатан Аллан
источник
Незначительные сокращения: xxd -u -p $1|fold -2|tr \\n \ .
Манатворк
Спасибо, есть идеи, как получить \nи \ работать в этой версии ссылки? РЕДАКТИРОВАТЬ: я добавил еще один побег персонажа.
Джонатан Аллан
Если я вас правильно понимаю, вы просто хотите перейти от двойных кавычек: попробуйте онлайн!
Манатворк
Огромное спасибо!
Джонатан Аллан
xxd -c1 -p -u $1|tr \\n \
Спуль
3

Котлин , 130 127 104 93 92 байта

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

Попробуйте онлайн!

Изменить: -11 байт благодаря @ChrisParton

Редактировать: Рабочая TIO

Редактировать: -1 байт благодаря @KevinCruijssen

Quinn
источник
1
Не могли бы вы отказаться от импорта и ссылки, Fileкак java.io.Fileвместо?
Крис Партон,
@ ChrisParton верно, спасибо!
Куинн
Здесь работает TIO. Вы можете использовать в ./.input.tioкачестве аргумента путь к файлу, и он будет использовать STDIN в качестве содержимого файла. :)
Кевин Круйссен
@KevinCruijssen спасибо! только что обновленный ответ
Куинн
1
Я не знаю Kotlin, но TIO все еще работает, если я уберу пробел в a:Array, так что я думаю, что вы можете сохранить байт.
Кевин Круйссен
2

Дротик , 140 134 байта

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

Попробуйте онлайн!

-6 байт, потому что я забыл уменьшить имена переменных

Elcan
источник
+1 за дротик. Такой недооцененный язык.
vasilescur
Трудно
играть
2

Haskell, 145 143 байта

import System.Environment
import Text.Printf
import Data.ByteString
main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
Damien
источник
1
Немного короче: import Data.ByteStringплюс main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
Ними
2

Rust, 141 байт (предоставленная версия)

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

Ржавчина, 151 байт (оригинальная версия)

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.
источник
-10 байт: TIO
Герман Л
2

bash + Stax, 6 + 4 + 1 = 11 байт

Это полная теория ремесла на данный момент. Вы не можете на самом деле запустить это. Если все работает в соответствии с его спецификацией, это будет работать, но еще не все.

Скрипт bash

]<$1

и программа Stax должна быть скомпилирована и сохранена в]

╛↕ßú┼_

Установите свой набор символов ISO 8859-1 (Windows-1252 здесь не будет работать) и перейдите

Распаковал и объяснил

_          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
Джошуа
источник
2

Emojicode , 186 162 байта

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

Попробуйте это онлайн здесь.

Ungolfed:

📦 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
источник
2

Perl 6 , 45 байт

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

Попробуйте онлайн!

  • @*ARGS[0] это первый аргумент командной строки.
  • .IOпревращает это (предполагаемое) имя файла в IO::Pathобъект.
  • .slurp(:bin)читает весь файл в Bufбуфер байтов. (Без этого :binсодержимое файла будет возвращено в виде строки Unicode.)
  • .list возвращает список значений байтов из буфера.
  • .fmt('%02X')это Listметод, который форматирует элементы списка с использованием заданной строки формата, а затем объединяет их с пробелами. (Удобный!)
  • .say печатает эту строку.
Шон
источник
Основываясь на ответе Python, ссылка TIO на самом деле вполне возможна.
Draco18s больше не доверяет SE
Некоторая перестановка может удалить .listдля 41 байта
Джо Кинг
1

Python 3, 75 байт

В основном копия ответа Максвелла на python 2.

import sys
print(' '.join('%02X'%b for b in open(sys.argv[1],'rb').read()))
Президент Джеймс Мовеон Полк
источник
ты имеешь ввиду наверное sys.argv[1]. с sys.argv[0]этим сценарием работает больше как квин ;-)
анион
@anion: упс, хаха, чинит ...
Президент Джеймс Мовеон Полк
1

Ракетка, 144 байта

Это представление выводит завершающий пробел, а не завершающий перевод строки. Дайте мне знать, если это считается лазейкой :)

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

Убрано

(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
источник
1

Forth (gforth) , 71 байт

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

Попробуйте онлайн!

TIO имеет 3 argв последней строке, потому что перед передачей кода TIO передает "-e пока" анализатору командной строки

Код Объяснение

: 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
источник
1

Javascript, 155 байт

for(b=WScript,a=new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(b.Arguments(0));;b.echo(('0'+a.read(1).charCodeAt(0).toString(16)).slice(-2)))
Питер Ферри
источник
1

VBScript, 143 байта

set a=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)):while 1 WScript.echo(right("0"+Hex(Asc(a.read(1))),2)):wend
Питер Ферри
источник
1

Wolfram Language (Mathematica) , 94 89 байт

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

Попробуйте онлайн!

Код довольно понятен из-за длинных имен команд. Это следует читать в основном справа налево:

$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
Роман
источник
1

Pyth , 12 байт

jdcr1.Hjb'w2

Попробуйте онлайн!

Принимает ввод как приглашение пользователя (нет доступа к аргументам командной строки 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()

(*) Я не уверен на 100%, если это так, но одна базовая 256 цифра (например, один символ) всегда будет конвертироваться в ровно 2 шестнадцатеричные цифры, что устраняет необходимость дополнения нулями.

ar4093
источник
1

Node.js, 118 байт

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

Как выглядит результат: введите описание изображения здесь

Кстати, содержание test.txtв примере выглядит следующим образом:

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

(С какой стати необходим вывод в верхнем регистре. Мне пришлось добавить преобразование с toUpperCase(), и это стоило 13 байтов.)

Сиеру Асакото
источник
0

C # .NET Framework 4.7.2 - 235 213 203 191 175 140 байт

Попробуйте онлайн!

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
источник
1
Я думаю, что следующее сэкономит несколько байтов (теперь я думаю 181): использование System.IO; класс P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (var b в File.ReadAllBytes (a [0])) {System.Console.Write ($ "{b.ToString (" X2 ")}");}}}}
PmanAce
@PmanAce Если вы удалите часть пустого пространства, оно уменьшится до 175.
facepalm42
0

05AB1E , 18 байт

IvyÇh2j' 0.:' Jvy?

Попробуйте онлайн!

Объяснение:

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
источник