İ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.