4

Hi I have a base 10 number for example 3198, and the hex representation is 0x0C7E

How do I convert that number to hex and put that hex value in a byte array in the format of [00][0C][7E], assuming the biggest hex value i can have is 0xffffff.

1
  • What C data type do you mean by "base 10 number"? C has integer types, and they don't differentiate between 3198 and 0x0C7E. Commented Dec 2, 2011 at 8:26

3 Answers 3

10

Maybe this will work ?

uint32_t x = 0x0C7E;
uint8_t bytes[3];

bytes[0] = (x >> 0)  & 0xFF;
bytes[1] = (x >> 8)  & 0xFF;
bytes[2] = (x >> 16) & 0xFF;


/* Go back. */
x = (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0] << 0);
Sign up to request clarification or add additional context in comments.

3 Comments

ah nice! thanks sorry i am very noob at C. But how do I convert 3198 to hex?
oh another question, if i want o revert the byte array back to the hex format how do i do it?
@cnicutar I have a question in your answer. You mean bytes[0] as MSB and bytes[2] as LSB right?
1

Number is already a continuous memory block - no need to convert it to yet ANOTHER array ! Just fetch separate bytes by using pointer arithmetic:

EDIT: Edited to be endianness-independent

#define FAST_ABS(x) ((x ^ (x>>31)) - (x>>31))

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } bint = {0x01020304};

    return bint.c[0] == 1; 
}    

uint32_t num = 0xAABBCCDD;
uint32_t N = is_big_endian() * 3;

printf("first byte 0x%02X\n"
       "second byte 0x%02X\n"
       "third byte 0x%02X\n"
       "fourth byte 0x%02X\n",
       ((unsigned char *) &num)[FAST_ABS(3 - N)],
      ((unsigned char *) &num)[FAST_ABS(2 - N)],
      ((unsigned char *) &num)[FAST_ABS(1 - N)],
      ((unsigned char *) &num)[FAST_ABS(0 - N)]
       );

4 Comments

Endianness-dependent. If you run this on a SPARC or PPC system (big-endian), you're getting the reverse.
See edit. I'v changed it to be endianness-invariant. Endianess check idea is taken from here
A complex solution to a problem that doesn't exist if you program in a portable way to start with, re - cnicutar's answer. I give you a +1 for shrewed persistence ;-)
I totally agree :-) I just wanted to show that in C - everything is bits and bytes - only interpretation of them is what really matters for compilers. That's the main power of C which i love most {and while others hate it and call it "non-existance of type system" in C :-) }
0
#include <stdio.h>

union uint32_value {
    unsigned int value;

    struct little_endian {
        unsigned char fou;
        unsigned char thi;
        unsigned char sec;
        unsigned char fir;
    } le;

    struct big_endian {
        unsigned char fir;
        unsigned char sec;
        unsigned char thi;
        unsigned char fou;
    } be;
};

int main(void)
{
    union uint32_value foo;
    foo.value = 3198;
    printf("%02x %02x %02x %02x\n", foo.le.fir, foo.le.sec, foo.le.thi, foo.le.fou);

    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.