clinux-kernelendianness

Convert a char array into an integer (big and little endian)


I am trying to convert a char array into integer, then I have to increment that integer (both in little and big endian).

Example:

char ary[6 ] = { 01,02,03,04,05,06};
long int b=0; // 64 bits

this char will be stored in memory

              address  0  1  2  3  4  5
              value   01 02 03 04 05 06   (big endian)
Edit :        value   01 02 03 04 05 06   (little endian)

-

memcpy(&b, ary, 6); // will do copy in bigendian L->R

This how it can be stored in memory:

       01 02 03 04 05 06 00 00 // big endian increment will at MSByte
       01 02 03 04 05 06 00 00 // little endian increment at LSByte

So if we increment the 64 bit integer, the expected value is 01 02 03 04 05 07. But endianness is a big problem here, since if we directly increment the value of the integer, it will results some wrong numbers. For big endian we need to shift the value in b, then do an increment on it.

For little endian we CAN'T increment directly. ( Edit : reverse and inc )

Can we copy the w r t to endianess? So we don't need to worry about shift operations and all.

Any other solution for incrementing char array values after copying it into integer?

Is there any API in the Linux kernel to it copy w.r.t to endianess ?


Solution

  • You need to read up on documentation. This page lists the following:

    __u64 le64_to_cpup(const __le64 *);
    __le64 cpu_to_le64p(const __u64 *);
    __u64 be64_to_cpup(const __be64 *);
    __be64 cpu_to_be64p(const __u64 *);
    

    I believe they are sufficient to do what you want to do. Convert the number to CPU format, increment it, then convert back.