Como prefixar 8 bytes de dados em um arquivo binário no Linux?

4

Gostaria de adicionar 8 bytes de dados ao início de um arquivo binário.

Existe um comando Linux para isso?

    
por mark 14.01.2011 / 07:58

4 respostas

14

Aqui está uma maneira de fazer isso.

printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile

O argumento para printf é uma sequência de 8 bytes em hexadecimal. Basta substituir os valores que usei (que são os caracteres ASCII "hello wo") com os seus.

    
por 14.01.2011 / 08:38
3

não é 'o' comando, é 'um monte de comandos' (na boa e antiga tradição unix):

  • coloque seus 8 bytes em um arquivo
  • acrescente o arquivo original a esse arquivo
  • renomeie o novo arquivo para o nome do arquivo original.

ou:

% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original

ou, se você precisar ler os 8 bytes de outro lugar:

% dd if=inputstream of=new_file bs=1 count=8

e continue como acima.

    
por 14.01.2011 / 08:38
1

Esta não é uma resposta adequada à pergunta original, mas apenas um comentário para abordar a preocupação muito apropriada no comentário de @mxmlnkn

So, I need to prepend 256kB to a 120GB file and I don't want to wait 30 minutes to completely copy and write the whole 120GB ... is there no way?

Pesquisa na Web para 'fallocate prepend to file', isso deve mostrar algumas respostas baseadas no StackExchange (EDIT: por exemplo, link ).

A abordagem fallocate, dado o Linux 4.1+ (XFS) ou 4.2+ (XFS, ext4) permite que você insira buracos no tamanho de páginas do sistema de arquivos, esperançosamente em tempo constante. Isso pode ou não ser suficientemente flexível para o seu problema.

    
por 18.02.2018 / 23:45
0

testado no cygwin, deve funcionar no linux.

usa xxd e sed

em uma linha

$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

quebrado

display a.a
$ cat a.a
abc



look at the hex of a.a  
user@comp ~
$ xxd -p a.a
6162630a

O arquivo realmente contém uma nova linha no final, como xxd mostra acima.

veja quantas linhas xxd -p imprime..será sempre uma independentemente do arquivo que é fornecido, uma vez que todos os caracteres dentro do arquivo são transformados em hexadecimais, e ele imprime um \ n real no final do que despejado. (o que você veria se fizesse xxd -p a.a | xxd -p)

$ xxd -p a.a | wc -l
1

sed opera em cada linha, e ao inserir xxd -p, o sed sempre será introduzido em apenas uma linha, de forma muito simples.

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/'
61626364656162630a

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

user@comp ~
$ xxd -p a2.a
61626364656162630a

user@comp ~
$ cat a2.a
abcdeabc

user@comp ~
$
    
por 19.02.2018 / 00:11