İkili dosyayı küçük endiandan büyük endian'a dönüştüren bir oneliner var mı?


14

ve tam tersi.

İlgili ise bir RedHat kullanıyorum.


6
Ne tür bir ikili dosya?
— Stéphane Chazelas

1
Her durumda, herhangi bir dosya formatı için, Perl ve pack / unpack kullanarak endianlığını dönüştürmek için bir astar yazabileceğinizden eminim . Bazı formatlar için, diğerlerinden daha uzun bir satır olacaktır. ;-)
— Ilmari Karonen

Yanıtlar:


34

Bunu yapamazsınız çünkü böyle bir dönüşüm için ikili içeriğin anlamını bilmeniz gerekir.

Örneğin, bir ikili dosyanın içinde bir dize varsa, dönüştürülmemelidir ve 4 baytlık bir tamsayı, iki baytlık bir tamsayıdan farklı bir işleme ihtiyaç duyabilir.

Başka bir deyişle, bayt sırası dönüşümü için bir veri türü açıklamasına ihtiyacınız vardır.


7
Sadece söyleyecektim. her bayt çiftini değiştirmek kadar basit değildir. örneğin bigendian'da 4 baytlık bir tamsayı 01 02 03 04 küçük endianda böyle görünebilir 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
— Rob

1
Kabul etti, endianness ham, daktilo bayt akışında bir anlam ifade etmiyor ... OP sorusunu düzenlemezse bu kabul edilen cevap olmalı
— Thomas

[alıntı gerekli] - AFAIK, bir uygulama başkalarını değil, bazı bayt sırasını açıkça koruyamazsa, baytların veya kelimelerin tutarlı bir şekilde sıralanması normaldir.
— sonraki duyuruya kadar duraklatıldı.

1
@DennisWilliamson: UTF-8 veya ASCII dizgisi endianiteye sahip değil. UTF-8 bayt sırasını belirtirken ASCII 7 bit ve çoklu bayt jetonları içermez. UTF-16 dizesi endianiteye sahiptir ve bu endianizmi işaretlemek için bir Malzeme Listesine sahip olabilir veya olmayabilir. Windows veya Java ile etkileşime girmesi amaçlanan Unix ikili dosyalarının her iki dizesi de olabilir;
— Kevin

Buraya veri açıklamasını ve veriyi verdiğiniz bir programı aramaya geldim ve dönüştürüyor. Şimdiye kadar böyle bir program bulamadım ama bu yapılamayacağı anlamına gelmiyor.
— Levi Morrison

32

İle byteswap yapabilirsiniz dd. Bu yeterli mi? Değilse, bir giriş dosyası ve beklenen dosyaya bir örnek vermek için lütfen sorunuzu güncelleyin.

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

2

Dosya içeriğiyle ilgilenmiyorsanız ve sadece bayt değiştirmek istiyorsanız endconv'u deneyin . Standart bayt dönüştürme işlevlerinin etrafındaki bir pakettir, bu nedenle 2, 4 ve 8 bayt uzunluğunda tamsayılarla dönüştürmeyi destekler. Ayrı bir program olduğu için tek bir astar değil.


0

Dosya endianessini değiştirmek için, word (32 bit) boyutunu varsayarak, bu 1 astar sizin için çalışmalıdır:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.