2013-10-04 45 views
0

我有一個程序的一部分,我需要隨機化一個字符串中的字符,但對如何執行此操作感興趣,程序可移植到可能不會使用ASCII編碼字符的系統。在C中實現二進制編碼字符的安全編碼?

目前我只是分配對應於ASCII表中一系列值的隨機整數。

與您如何做'sizeof(int)'類似,您如何安全地編碼隨機字符的賦值?

我知道你可以創建一個靜態數組,每個字符都存在,並從一個隨機索引中分配一個字符,但我很好奇,看看是否有其他選擇。

+0

你只對字母數字字符感興趣嗎?或者整個字符集? – effeffe

+0

只需字母數字字符即可。如果我也想要整套音樂會有什麼不同? – sherrellbc

+0

使用字母數字字符與字符集的部分獨立性是因爲它們的值必須是「contiguos」(對於英文不好):'A','B',...'Z',數字相同。編輯:**沒有**,對不起,這只是數字所必需的。 – effeffe

回答

0

C代碼字符編碼是獨立於數據可以使用的。

C代碼的字符集是獨立的它可能使用的潛在字符串的編碼。人們可以很容易地用ASCII編寫C代碼來處理EBCDIC或UTF-8字符串。

人們可以斷言uint32_t就能滿足任何給定的字符,但是一旦一個進入世界UTF,但最大代碼點是「\ U0010FFFF」,多個代碼點可以構成一個字符。任何UTF都有很多字母數字字符。

假設代碼限制隨機36個字母數字字符:0-9,A-Z。使用建議的表查找可以在有限的情況下用於各種編碼,如ASCII,EBCDIC,UTF-8,UTF16-BE,UTF16-BE,UTF32-BE,UTF32-BE。每個表項都需要使用明確的值並以endian獨立的方式。考慮如下的小尾數。

typedef enum eEncoding { 
    eASCII, 
    eUTF16BE, 
    eUTF16LE, 
    ... 
    eEncoding_N 
}; 
unit8_t Table[eEncoding_N][36][5]; 
Table[eASCII][10 /* A */] = { 48, 0, 0, 0, 1 /* Length */ } 
Table[eASCII][11 /* B */] = { 49, 0, 0, 0, 1 /* Length */ } 
Table[eEBCIDIC][10]  = {193, 0, 0, 0, 1 /* Length */ } 
Table[eUTF16BE][10]  = { 0,48, 0, 0, 2 /* Length */ } 
Table[eUTF16LE][10]  = { 48, 0, 0, 0, 2 /* Length */ } 
...