바이너리 파일을 리틀 엔디안에서 빅 엔디안으로 변환하는 oneliner가 있습니까?


14

그 반대.

관련이 있다면 RedHat을 실행하고 있습니다.


6
어떤 유형의 이진 파일입니까?
Stéphane Chazelas

1
어쨌든 모든 파일 형식에 대해 Perl 및 pack / unpack을 사용하여 엔디안을 변환하는 하나의 라이너를 작성할 수 있다고 확신합니다 . 일부 형식의 경우 다른 형식보다 긴 줄입니다. ;-)
Ilmari Karonen

답변:


34

이러한 변환의 경우 이진 컨텐츠의 의미를 알아야하기 때문에이를 수행 할 수 없습니다.

예를 들어 이진 파일 안에 문자열이 있으면 변환해서는 안되며 4 바이트 정수는 2 바이트 정수와 다른 처리가 필요할 수 있습니다.

즉, 바이트 순서 변환의 경우 데이터 유형 설명이 필요합니다.


7
나는 단지 그런 말을했다. 모든 바이트 쌍을 바꾸는 것만 큼 간단하지 않습니다. 예를 들어 bigendian의 4 바이트 정수 01 02 03 04는 리틀 엔디안에서 다음과 같이 보일 수 있습니다. 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
동의, 엔디안은 원시, 유형이없는 바이트 스트림에서 의미가 없습니다 ... OP가 자신의 질문을 편집하지 않으면 받아 들일만한 대답이어야합니다
Thomas

[citation needed]-AFAIK, 응용 프로그램이 명시 적으로 일부 바이트 순서를 유지하고 다른 바이트 순서를 유지하지 않는 한, 바이트 또는 단어가 전체적으로 일관되게 정렬되는 것이 일반적입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

1
@DennisWilliamson : UTF-8 또는 ASCII 문자열에는 엔디안이 없습니다. UTF-8은 바이트 순서를 지정하고 ASCII는 7 비트이며 멀티 바이트 토큰은 없습니다. UTF-16 문자열에는 엔디안이 있으며 해당 엔디안을 표시 할 BOM이 있거나 없을 수 있습니다. Windows 또는 Java와 상호 작용하기위한 Unix 바이너리에는 두 가지 유형의 문자열이있을 수 있으므로 변환시 구별해야합니다.
Kevin

여기에 데이터 설명과 데이터를 제공하고 변환하는 프로그램을 찾으러 왔습니다. 지금까지 나는 그런 프로그램을 찾지 못했지만 그렇게 할 수 없다는 것을 의미하지는 않는다.
Levi Morrison

32

로 바이트 스왑 할 수 있습니다 dd. 충분합니까? 그렇지 않은 경우 입력 파일 및 예상 출력 파일의 예를 제공하도록 질문을 업데이트하십시오.

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

파일 내용에 신경 쓰지 않고 바이트를 바꾸려면 endconv 시도 하십시오 . 표준 바이트 변환 함수를 감싸는 래퍼이므로 2, 4 및 8 바이트 길이의 정수로 변환을 지원합니다. 별도의 프로그램이기 때문에 하나의 라이너가 아닙니다.


0

워드 (32 비트) 크기를 가정 할 때 파일 엔디 어 니스를 변경하려면이 1 개의 라이너가 적합합니다.

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.