2014-02-20 57 views
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++; 
    } 
} 

在上面的代碼,是什麼行爲:將short轉換爲char是否合法?

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

+0

當你這樣做時,要小心對齊問題:它非常依賴於架構,你可能會遇到總線錯誤。 – cup

+0

這不是我的代碼,我只是複製這個...所以,我應該避免它?如果是這樣,如何解決上述代碼是「適當」的C++? – Luka

+0

如果您想知道效果,只需運行一些虛擬數據並查看生成的內容。如果這就是你想要的,那麼就離開它。如果它不是你想要的,那麼改變它。請注意,out_data不是空終止。可能值得在for循環之後添加這個。 – cup

回答

1

按照C++03 - 沒有它不是合法的,因爲它打破了嚴格別名規則。一些像gcc這樣的編譯器接受這一點,即使沒有警告。你將不得不使用轉換將字符轉換成短褲,一個能夠處理這個問題的類而不是char緩衝區,甚至還有一個工會來命名一些選項。

+0

它實際上打破了嚴格的別名規則。數組下標的類型爲'char',可以進行簽名。 – jrok

+0

那麼,最後短數組的大小是char數組大小的一半? – Luka

+0

@jrok - 我不明白爲什麼這兩行會打破別名規則。爲了確保我用g ++編譯了這個。 – WeaselFox