安全编码在C中实现二进制编码字符?

时间:2013-10-04 14:46:17

标签: c ascii

我有一个程序的一部分,我需要在字符串中随机化字符但我对如何执行此操作感兴趣,使程序可以移植到可能无法用ASCII编码字符的系统。

目前我只是在ASCII表中分配对应于一系列值的随机整数。

类似于你如何做'sizeof(int)'这样的事情,你怎么能安全地编写随机字符的分配?

我知道你可以创建一个静态数组,每个字符都存在,并从随机索引中分配一个字符,但我很想知道是否有替代品。

1 个答案:

答案 0 :(得分: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 */ }
...