2011-12-15 68 views
8

Làm cách nào để tạo tệp nhị phân có các giá trị nhị phân hậu quả trong bash?tạo tệp nhị phân trong bash

như:

$ hexdump testfile 
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e 
0000010 1110 1312 1514 1716 1918 1b1a 1d1c 1f1e 
0000020 2120 2322 2524 2726 2928 2b2a 2d2c 2f2e 
0000030 .... 

Trong C, tôi làm:

fd = open("testfile", O_RDWR | O_CREAT); 
for (i=0; i< CONTENT_SIZE; i++) 
{ 
    testBufOut[i] = i; 
} 
num_bytes_written = write(fd, testBufOut, CONTENT_SIZE); 
close (fd); 

đây là những gì tôi muốn:

#!/bin/bash 
i=0 
while [ $i -lt 256 ]; do 
    h=$(printf "%.2X\n" $i) 
    echo "$h"| xxd -r -p 
    i=$((i-1)) 
done 
+1

Thậm chí nếu bạn có thể đơn giản hóa ví dụ của bạn để làm cho nó ngắn hơn: Mã này không kiểm tra lỗi VÀ KHÔNG SỬ DỤNG viết (2) bởi vì nó hoàn toàn ok không chỉ thất bại, mà còn để chỉ viết một phần. Sử dụng fwrite (3) hoặc tương tự thay vì –

Trả lời

6

Có lẽ bạn có thể có một cái nhìn để xxd :

xxd: tạo kết xuất hex của một tệp nhất định hoặc đầu vào chuẩn. Nó có thể cũng chuyển đổi một kết xuất hex trở lại dạng nhị phân ban đầu của nó.

+0

cảm ơn, 'xxd' là những gì tôi cần – mustafa

+2

Đối với những người muốn biết cách sử dụng' xxd' để viết mà không cần phải đi và tra cứu nó (như tôi phải): 'echo "0000400: 4142 4344" | xxd -r - data.bin' trong đó '0000400' là byte offset vào tập tin và các byte hex' 41' qua '44' là những gì được viết (không gian nhúng được bỏ qua). Ví dụ này viết chuỗi 'ABCD' ở 1024 byte vào tệp 'data.bin'. – starfry

10

Chỉ có 1 byte bạn không thể chuyển làm đối số trong dòng lệnh bash: 0 Đối với bất kỳ giá trị nào khác, bạn chỉ có thể chuyển hướng nó. Nó an toàn.

echo -n $'\x01' > binary.dat 
echo -n $'\x02' >> binary.dat 
... 

Đối với giá trị 0, có một cách khác để đầu ra nó vào một tập tin

dd if=/dev/zero of=binary.dat bs=1c count=1 

Để thêm nó vào tập tin, sử dụng

dd if=/dev/zero oflag=append conv=notrunc of=binary.dat bs=1c count=1 
+1

Chỉ cần 'dd if =/dev/zero bs = 1 count = 1' wothout' of' và 'oflag' xuất ra byte' NUL' thành stdout. Vì vậy, bạn có thể làm một '>' hoặc '>>'. – glglgl

2

Nếu bạn không nhớ để không sử dụng lệnh hiện có và muốn mô tả dữ liệu của bạn trong tệp văn bản, bạn có thể sử dụng binmake là chương trình C++ mà bạn có thể biên dịch và sử dụng như sau:

đầu tiên nhận được và biên dịch binmake (nhị phân sẽ được ở bin/):

$ git clone https://github.com/dadadel/binmake 
$ cd binmake 
$ make 

Tạo file văn bản của bạn file.txt:

big-endian 
00010203 
04050607 
# separated bytes not concerned by endianess 
08 09 0a 0b 0c 0d 0e 0f 

Tạo tập tin nhị phân của bạn file.bin:

$ ./binmake file.txt file.bin 
$ hexdump file.bin 
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e    
0000008 

Lưu ý: bạn cũng có thể sử dụng nó với stdin/stdout

+0

Nếu bạn đi tuyến đường này, bạn có thể chỉ nên sử dụng một công cụ tiêu chuẩn (od cho tính di động, hoặc xxd cho khả năng sử dụng). –

Các vấn đề liên quan