Existe-t-il un oneliner qui convertit un fichier binaire de petit endian en big endian?

14

et vice versa.

J'utilise un RedHat si nécessaire.

L'élève de Fermat
la source
6
Quel type de fichier binaire?
Stéphane Chazelas
1
Dans tous les cas, pour n'importe quel format de fichier, je suis sûr que vous pourriez écrire un one-liner pour convertir son endianness en utilisant Perl et pack / unpack . Pour certains formats, ce sera juste une ligne plus longue que pour d'autres. ;-)
Ilmari Karonen

Réponses:

34

Vous ne pouvez pas le faire car pour une telle conversion, vous devez connaître la signification du contenu binaire.

S'il y a par exemple une chaîne à l'intérieur d'un fichier binaire, elle ne doit pas être convertie et un entier de 4 octets peut nécessiter un traitement différent d'un entier de deux octets.

En d'autres termes, pour une conversion d'ordre des octets, vous avez besoin d'une description du type de données.

schily
la source
7
Je voulais juste dire ça. ce n'est pas aussi simple que d'échanger chaque paire d'octets. par exemple, un entier de 4 octets 01 02 03 04 en bigendien pourrait ressembler à ceci en petit endian 04 02 03 01 PAS 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob
1
D'accord, l'endianité n'a aucun sens sur un flux d'octets brut et sans type ... cela devrait être la réponse acceptée si OP ne modifie pas sa question
Thomas
[citation nécessaire] - AFAIK, sauf si une application préserve explicitement un certain ordre d'octets et pas d'autres, alors il est habituel que les octets ou les mots soient ordonnés de manière cohérente tout au long.
pause jusqu'à nouvel ordre.
1
@DennisWilliamson: Une chaîne UTF-8 ou ASCII n'a pas d'endianité. UTF-8 spécifie l'ordre des octets tandis que l'ASCII est à 7 bits et n'a pas de jetons multi-octets. Une chaîne UTF-16 a une endianité et peut ou non avoir une nomenclature pour marquer cette endianité. Un binaire Unix destiné à interagir avec Windows ou Java peut avoir les deux types de chaîne, ce qui signifie que vous devez les distinguer lors de la conversion.
Kevin
Je suis venu ici à la recherche d'un programme où vous lui donnez la description des données et les données et il les convertit. Jusqu'à présent, je n'ai pas trouvé un tel programme, mais cela ne signifie pas qu'il ne peut pas être fait.
Levi Morrison
32

Vous pouvez échanger des bytes avec dd. Est-ce suffisant? Sinon, veuillez mettre à jour votre question pour donner un exemple de fichier d'entrée et le fichier de sortie attendu.

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o
roaima
la source
2

Si vous ne vous souciez pas du contenu des fichiers et que vous souhaitez simplement échanger des octets, essayez endconv . Il s'agit simplement d'un wrapper autour des fonctions de conversion d'octets standard, il prend donc en charge la conversion par des entiers longs de 2, 4 et 8 octets. Ce n'est pas un liner, car c'est un programme distinct.


la source
0

Afin de changer l'endianess du fichier, en supposant que la taille du mot (32 bits), cette 1 ligne devrait fonctionner pour vous:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
hesham_EE
la source