1
unsigned char HexLookup[513] = {
    "000102030405060708090a0b0c0d0e0f"
    "101112131415161718191a1b1c1d1e1f"
    "202122232425262728292a2b2c2d2e2f"
    "303132333435363738393a3b3c3d3e3f"
    "404142434445464748494a4b4c4d4e4f"
    "505152535455565758595a5b5c5d5e5f"
    "606162636465666768696a6b6c6d6e6f"
    "707172737475767778797a7b7c7d7e7f"
    "808182838485868788898a8b8c8d8e8f"
    "909192939495969798999a9b9c9d9e9f"
    "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
    "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
    "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
    "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
    "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
    "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
};

void to_hex(char* in_data, unsigned int in_data_size, char* out_data)
{
    unsigned short *pwHex =  (unsigned short*)HexLookup;

    for (unsigned int i = 0; i < in_data_size; i++)
    {
        *out_data = pwHex[*in_data];
        in_data++;
        out_data++;
    }
}

In the code above, what is the behavior of:

unsigned short *pwHex = (unsigned short*)HexLookup;
*out_data = pwHex[*in_data];

starsplusplus
  • 1,232
  • 3
  • 19
  • 32
Luka
  • 1,761
  • 2
  • 19
  • 30
  • Beware of alignment problems when you do this: it is very architecture dependent and you might get a bus error. – cup Feb 20 '14 at 09:30
  • It's not my code, I just copied this... So, I should avoid it? If so, how to fix the above code to be "proper" c++? – Luka Feb 20 '14 at 09:32
  • If you want to know the effect, just run it with some dummy data and see what is generated. If that is what you want, then leave it. If it is not what you want, then change it. Note that out_data is not null terminated. Might be worth adding this after the for loop. – cup Feb 20 '14 at 09:47

1 Answers1

1

According to the C++03 - no its not legal because it breaks the strict aliasing rule. some compilers like gcc accept this, even without warnings. You will have to convert the chars to shorts using shifting, a class able to handle this instead of the char buffer, or even a union to name a few options.

Community
  • 1
  • 1
WeaselFox
  • 7,220
  • 8
  • 44
  • 75