Chương trình bán phá giá hex ngắn nhất


13

Thử thách

Tạo một chương trình điều khiển để hiển thị từng byte của một tệp.


Chiến thắng

Vì đây là , nên ít byte nhất sẽ thắng.


Quy tắc

  • Chương trình phải là một ứng dụng giao diện điều khiển , nghĩa là nó sẽ được chạy từ một loại trình thông dịch dòng lệnh;
  • Mỗi byte phải là chữ thập lục phân, cách nhau bởi một khoảng trắng và nó phải có 2 chữ số; (đặt số 0 trước nó nếu nó có 1 chữ số)
  • Tệp phải được đọc bằng IO hoặc thay thế, và không được mã hóa cứng;
  • Đường dẫn tệp phải được chỉ định làm đối số dòng lệnh hoặc dấu nhắc người dùng (như STDIN) ;
  • Xin vui lòng không có sơ hở ;

Thí dụ

test.txt (kết thúc bằng LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A

16
@ facepalm42 Để tránh facepalms, tôi thực sự khuyên bạn nên sử dụng Sandbox để giúp bạn thiết kế các thách thức trong tương lai trước khi đăng chúng.
Adám

2
Làm thế nào có thể hiển thị tất cả các giá trị byte cùng một lúc, nếu nó không vừa với màn hình? Cuộn rõ ràng không phải là "cùng một lúc". Ngoài ra, có gì sai với (một hàm) chỉ trả về các giá trị?
Adám

7
@ facepalm42 Vui lòng không thay đổi thông số quá lâu sau khi đăng thử thách. Bài đăng gốc không chỉ định định dạng chính xác của các số thập lục phân, để lại cho người trả lời. Chỉnh sửa mới nhất của bạn đã vô hiệu hóa câu trả lời hiện tại của tôi!
Adám

11
Có một lý do cụ thể nào mà bạn chỉ cho phép đối số dòng lệnh hoặc dấu nhắc người dùng không? Có gì sai với việc lấy tên tệp làm đối số hàm?
Adám

3
Sẽ rất hữu ích nếu bạn có một hello.txttệp văn bản đơn giản làm ví dụ làm đầu vào và đầu ra dự kiến ​​sẽ là gì. Ví dụ, nếu hello.txtchứa đơn giản là từ hellocó ngắt dòng, thì từ này được thể hiện như thế nào trong đầu ra? Bạn đang nhóm các byte trong các từ 16 bit, 32 bit hay 64 bit? Hoặc là mỗi byte được biểu thị dưới dạng hex hai chữ số? Các không gian có thể được chấp nhận sau mỗi byte dưới dạng hex hay sau mỗi từ x-bit? Bạn có yêu cầu 0xsửa trước cho mỗi byte không?
Shaun Bebbers

Câu trả lời:



6

Ruby , 26 byte

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

Hãy thử trực tuyến!


Điều này có đọc nội dung của một tệp được cung cấp một đường dẫn tệp làm đối số chương trình không? Dựa trên TIO dường như chỉ đọc từ STDIN, nhưng tôi không biết rõ về Ruby - đủ để nói rằng nó không chính xác.
Kevin Cruijssen

1
@KevinCruijssen Có, nó lấy (các) đường dẫn tệp làm đối số chương trình. Nếu không có đối số, $<chuyển sang đọc từ STDIN thay thế.
Mực giá trị


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 nhờ @Holger .

Hãy thử trực tuyến bằng cách sử dụng ./.input.tiolàm đường dẫn tệp đối số, sẽ có đầu vào đã cho dưới dạng nội dung tệp.

Giải trình:

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

Lý do đằng sau sử dụng interfacethay vì là classgì?
JakeDot

4
@JakeDot chính được yêu cầu là công khai, các phương thức giao diện luôn công khai, interfacengắn hơn class+ public.
Grimmy

3
Với Java 11, bạn có thể sử dụng Path.ofthay vìPaths.get
Holger

1
@Holger Cảm ơn! :)
Kevin Cruijssen

2
@Grimy kể từ Java 9, các phương thức giao diện không phải lúc nào cũng được public, nhưng chúng publictrừ khi được khai báo rõ ràng private.
Holger

6

PHP , 60 59 54 byte

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

Hãy thử trực tuyến!


1
Nếu có thể bỏ dấu ?>và lưu 2 byte hoặc nếu nó không hoạt động thì thay thế ?>bằng dấu chấm phẩy và lưu 1 byte.
manassehkatz-Di chuyển 2 Codidact

2
Sử dụng implode(file($x))thay vì file_get_contents($x)(-4 byte).
Hố đen

2
wordwrap(), với 1tham số cuối cùng, ngắn hơn một byte chunk_split().
Hố đen


4

APL (Unicode Dy) , 16 byte

Chức năng tiền tố ẩn danh. Trả về (và in hoàn toàn, nếu giá trị không được tiêu thụ theo cách khác) một ma trận hai hàng với 4 bit trên cùng được biểu thị dưới dạng số thập phân 01515 ở hàng trên cùng và 4 bit dưới cùng được biểu thị tương tự ở hàng dưới cùng. Nghĩa là, ma trận có nhiều cột như tệp có byte.

16 1683 ¯1∘⎕MAP

Hãy thử trực tuyến!

⎕MAP ánh xạ tên tệp đối số thành một mảng
 với các tham số:
¯1 toàn bộ chiều dài của tệp
83 được đọc dưới dạng số nguyên 8 bit

16 16⊤ chuyển đổi (chống cơ sở) thành thập lục phân 2 vị trí


1
@ facepalm42 Nó rất nhiều ở dạng thập lục phân. Ví dụ: H72, là 4 × 16¹ + 8 × 16⁰ hoặc [4,8]. Do đó cột đầu tiên trong ví dụ đọc [4,8].
Adám

Ôi, tôi hoàn toàn quên mất! Lấy làm tiếc.
facepalm42

4

Python 3, 59 byte

-11 byte nhờ Hầu hết vô hại!

-8 byte nhờ James K Polk!

-24 byte nhờ màu xanh!

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

Hãy thử trực tuyến!

Việc này thật thẳng thắn; nó mở một tên tệp được đưa ra làm đầu vào trên STDIN, đọc nó, chuyển đổi từng ký tự thành giá trị ASCII của nó, chuyển đổi từng số thành hex, loại bỏ các "0x"giá trị hexad trước đó trong Python, đệm giá trị bằng 0 nếu cần, sau đó nối các giá trị cùng với không gian.


Có thể lưu một vài byte '%02X'%ord(i)thay vì cắt đầu ra của hex
Chủ yếu là vô hại

@MostlyHarmless Xong! -11 byte. Cảm ơn!
lập trình viên

làm thế nào về '% 02X' thay vì '% 02x' và thoát khỏi.upper()
James Rebstate Monica Polk

Bạn có thể lưu các byte từ import sysbằng cách sử dụng raw_input()làm tên tệp thay thế; quy tắc cho phép người dùng nhắc nhở.
Màu xanh

@Blue Cảm ơn! Và nó thậm chí còn ngắn hơn trong Python 3, nơi bạn có thể làminput()
lập trình viên

3

Bash ,  33  23 byte

... với rất nhiều sự giúp đỡ:
-3 nhờ vào manatwork
-4 nhờ vào spuck
-3 nhờ Nahuel Fouilleul

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

Hãy thử trực tuyến!

Lưu ý rằng liên kết TIO ở trên sử dụng đầu vào - chúng ta có thể ghi tệp cục bộ, do đó, điều này cho thấy nó hoạt động như một chương trình lấy đường dẫn tệp.


Giảm nhẹ : xxd -u -p $1|fold -2|tr \\n \ .
manatwork

Cảm ơn, có ý tưởng nào để có được \n\ hoạt động trong phiên bản liên kết 'this' không? EDIT: Tôi đã thêm một nhân vật thoát.
Jonathan Allan

Nếu tôi hiểu bạn một cách chính xác, bạn chỉ muốn thay đổi từ dấu ngoặc kép thành dấu ngoặc đơn: Hãy thử trực tuyến!
manatwork

Tuyệt vời cảm ơn bạn!
Jonathan Allan

xxd -c1 -p -u $1|tr \\n \
nhổ

3

Kotlin , 130 127 104 93 92 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: -11 byte nhờ @ChrisParton

Chỉnh sửa: Làm việc TIO

Chỉnh sửa: -1 byte nhờ @KevinCruijssen


1
Bạn có thể bỏ cái dự án nhập khẩu và tài liệu tham khảo Filenhư java.io.Fileđể thay thế?
Chris Parton

@ChrisParton đúng là bạn, cảm ơn!
Quinn

Đây là một TIO làm việc. Bạn có thể sử dụng ./.input.tiolàm đối số đường dẫn tệp và nó sẽ sử dụng STDIN làm nội dung tệp. :)
Kevin Cruijssen

@KevinCruijssen cảm ơn! vừa cập nhật câu trả lời
Quinn

1
Tôi không biết Kotlin, nhưng TIO vẫn hoạt động nếu tôi xóa khoảng trống tại a:Array, vì vậy tôi nghĩ bạn có thể tiết kiệm một byte.
Kevin Cruijssen

2

Phi tiêu , 140 134 byte

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

Hãy thử trực tuyến!

-6 byte vì tôi quên giảm tên biến


+1 cho phi tiêu. Thật là một ngôn ngữ bị đánh giá thấp.
vasilescur

Khó chơi golf, vì về cơ bản, nó không có hệ thống loại rất lỏng lẻo
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

1
Ngắn hơn một chút: import Data.ByteStringcộng main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi

2

Rust, 141 byte (phiên bản đóng góp)

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 (phiên bản gốc)

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!()}

-10 byte: TIO
Herman L

2

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

Đây là lý thuyết hoàn chỉnh thủ công vào thời điểm này. Bạn thực sự không thể chạy cái này. Nếu mọi thứ hoạt động theo thông số kỹ thuật của nó thì nó sẽ hoạt động, nhưng không phải mọi thứ đều chưa.

Kịch bản bash là

]<$1

và chương trình stax phải được biên dịch và lưu vào] là

╛↕ßú┼_

Đặt ký tự của bạn thành ISO 8859-1 (Windows-1252 sẽ không hoạt động ở đây) và đi

Giải nén và giải thích

_          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

Biểu tượng cảm xúc , 186 162 byte

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

Hãy thử trực tuyến tại đây.

Ung dung:

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

2

Perl 6 , 45 byte

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

Hãy thử trực tuyến!

  • @*ARGS[0] là đối số dòng lệnh đầu tiên.
  • .IObiến tên tệp (giả định) đó thành một IO::Pathđối tượng.
  • .slurp(:bin)đọc toàn bộ tập tin vào một Bufbộ đệm byte. (Nếu không có :binnội dung tệp sẽ được trả về dưới dạng chuỗi Unicode.)
  • .list trả về một danh sách các giá trị byte từ bộ đệm.
  • .fmt('%02X')là một Listphương thức định dạng các thành phần của danh sách bằng chuỗi định dạng đã cho, sau đó nối chúng với khoảng trắng. (Tiện lợi!)
  • .say in chuỗi đó.

Dựa trên câu trả lời của Python, trên thực tế , một TIO Link hoàn toàn có thể.
Draco18 không còn tin tưởng SE

Một số sắp xếp lại có thể loại bỏ .list cho 41 byte
Jo Vua



1

Vợt, 144 byte

Nội dung gửi này không tạo ra một khoảng trắng ở cuối và không có dòng mới. Hãy cho tôi biết nếu điều này được coi là một lỗ hổng :)

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

Làm sạch

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

1

Forth (gforth) , 71 byte

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

Hãy thử trực tuyến!

TIO có 3 arg dòng cuối cùng vì TIO chuyển "-e bye" cho trình phân tích cú pháp dòng lệnh trước khi chuyển mã

Giải thích mã

: 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

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

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

1

Ngôn ngữ Wolfram (Mathicala) , 94 89 byte

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

Hãy thử trực tuyến!

Mã này khá tự giải thích vì tên lệnh dài. Nó nên được đọc chủ yếu từ phải sang trái:

$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

Gema , 45 ký tự

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

Chạy mẫu:

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 

Hãy thử trực tuyến!


1

Bình thường , 12 byte

jdcr1.Hjb'w2

Hãy thử trực tuyến!

Đưa đầu vào là dấu nhắc người dùng (không có cách nào để truy cập các đối số dòng lệnh 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()

(*) Tôi không chắc chắn 100% nếu điều này được dự định, nhưng một chữ số 256 cơ sở (như trong một ký tự), sẽ luôn chuyển đổi thành chính xác 2 chữ số hex, loại bỏ sự cần thiết phải đệm bằng số không.


1

Node.js, 118 byte

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

Kết quả trông như thế nào: nhập mô tả hình ảnh ở đây

Btw nội dung test.txttrong ví dụ như sau:

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

(Tại sao trên trái đất là đầu ra chữ hoa cần thiết. Tôi đã phải thêm chuyển đổi với toUpperCase()và chi phí là 13 byte.)


0

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

Hãy thử trực tuyến!

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") + " ");
            }
        }
    }
}

1
Tôi nghĩ rằng những điều sau đây sẽ tiết kiệm một số byte (bây giờ tôi nghĩ là 181): sử dụng System.IO; class P {static void Main (string [] a) {if (a.Lipse> 0 && File.Exists (a [0]) ) {foreach (var b trong File.Read ALLBytes (a [0])) {System.Console.Write ($ "{b.ToString (" X2 ")}");}}}}
PmanAce 17/07/19

@PmanAce Nếu bạn xóa một số khoảng trắng, nó sẽ giảm xuống 175.
facepalm42

0

05AB1E , 18 byte

IvyÇh2j' 0.:' Jvy?

Hãy thử trực tuyến!

Giải trình:

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?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.