detect endianness of a binary with python

Thomas Jollans thomas at jollans.com
Wed Jul 21 15:06:38 EDT 2010


On 07/21/2010 05:29 PM, Holger brunck wrote:
> 
>>> Something like the "file" utility for linux would be very helpfull.
>>>
>>> Any help is appreciated.
> 
>> You're going to have to describe in detail what's in the file before
>> anybody can help.
> 
> We are creating inside our buildsystem for an embedded system  a cram filesystem
> image. Later on inside our build process we have to check the endianness,
> because it could be Little Endian or big endian (arm or ppc).
> 
> The output of the "file" tool is for a little endian cramfs image:
> <ourImage>: Linux Compressed ROM File System data, little endian size 1875968
> version #2 sorted_dirs CRC 0x8721dfc0, edition 0, 462 blocks, 10 files
> 
> It would be possible to execute
> ret = os.system("file <ourImage> | grep "little endian")
> and evaluate the return code.
> But I don't like to evaluate a piped system command. If there is an way without
> using the os.system command this would be great.

Files don't, as such, have a detectable endianess. 0x23 0x41 could mean
either 0x4123 or 0x2341 - there's no way of knowing.

The "file" utility also doensn't really know about endianess (well,
maybe it does swap bytes here and there, but that's an implementation
detail) - it just knows about file types. It knows what a little-endian
cramfs image looks like, and what a big-endian cramfs image looks like.
And as they're different, it can tell them apart.

If you're only interested in a couple of file types, it shouldn't be too
difficult to read the first few bytes/words with the struct module and
apply your own heuristics. Open the files in question in a hex editor
and try to figure out how to tell them apart!



More information about the Python-list mailing list