Search code examples
cendiannessunix-timestamptype-conversion

How to convert a 48-bit byte array into an 64-bit integer in C?


I have an unsigned char array whose size is 6. The content of the byte array is an integer (4096*number of seconds since Unix Time). I know that the byte array is big-endian.

Is there a library function in C that I can use to convert this byte array into int_64 or do I have to do it manually?

Thanks!

PS: just in case you need more information, yes, I am trying to parse an Unix timestamp. Here is the format specification of the timestamp that I dealing with.


Solution

  • A C99 implementation may offer uint64_t (it doesn't have to provide it if there is no native fixed-width integer that is exactly 64 bits), in which case, you could use:

    #include <stdint.h>
    
    unsigned char data[6] = { /* bytes from somewhere */ };
    uint64_t result = ((uint64_t)data[0] << 40) |
                      ((uint64_t)data[1] << 32) |
                      ((uint64_t)data[2] << 24) |
                      ((uint64_t)data[3] << 16) |
                      ((uint64_t)data[4] << 8)  |
                      ((uint64_t)data[5] << 0);
    

    If your C99 implementation doesn't provide uint64_t you can still use unsigned long long or (I think) uint_least64_t. This will work regardless of the native endianness of the host.