如何从字符串初始化字符数组,其中包含特殊的十六进制值

时间:2017-12-11 16:26:23

标签: c gcc

我得到一个"启动器在加载时是不可计算的"使用第一行代码在gcc-89中出错。 99年似乎没问题。 下面两行有什么区别?

const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"};
const unsigned char BYTES[] = {0x02, 0x46, 0x46, 0x46, 0x45, 0x55, 0x0C, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46};

第二行工作正常,但是查找ASCII表中的每个字符都太复杂了。

2 个答案:

答案 0 :(得分:1)

一般来说,有两种方法可以初始化常量字符数组:(1)使用字符值初始值设定项列表进行初始化

const char bytes1[] = { 'A', 65, 0x41, 0101, 0 }; // results in a zero terminated string "AAAA"

这里,每个值都是不同代码表示中的单个字符值。

(2)用字符串文字初始化,可以选择用大括号括起来

const char bytes2[] = "AAAA";
const char bytes3[] = { "AAAA" };

这两个是等价的,都导致相同的零终止字符串。但是,只要{ "AAAA" }语法有效并不意味着与逗号和更多值的任何组合都是有效的。

// ALL of the following are INVALID
const char bytes4[] = { "AAA", 'A' };
const char bytes5[] = { 'A', "AAA" };
const char bytes6[] = { "AA", "AA" };

现在您的问题涉及第二个主题:字符序列/字符串文字中的十六进制值。如上所示,'A'可以在ascii中表示为十进制65,65可以表示为十进制,八进制,十六进制,......

利用单个字符值,可能如下所示(记住bytes1):

const char bytes7[] = { '\x41', 'A', '\101', 'A', 0 };

直接翻译成字符串文字时出现问题:

// The following is INVALID
const char bytes8[] = "\x41A\101A";

直接写入与字符串文字相同的内容是不可能的,因为在"\x41A"中,A将被视为十六进制序列的一部分,而不是十六进制之后的单独字符。结果值将超出字符类型的范围。这可以通过字符串文字的连接来解决:"\x41" "A" - 只有两个文字彼此相邻,中间没有任何非空白字符。

// The following is VALID
const char bytes9[] = "\x41" "A\101A";

因此,同样的原则可适用于您的案例:

// VALID
const unsigned char BYTES[] = { "\x02" "FFFEU\x0C" "FFFFFFFF" };

十六进制序列中的前导0并不是必需的,如上所述,大括号也是可选的。

答案 1 :(得分:0)

案例1:

const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"};

这里BYTES是一个const char array,即你可以不存储任何字符(允许使用int),但是如何将strings(“FFFEU”< - 参见双引号)存储到此中,它应该是0xFFFEU'FFFEU'

修改为

const unsigned char BYTES[] = {0x02, 0xFFFEU, 0x0C, 0xFFFFFFFF};

但是你再次无法将big data(0xFFFEU)存储在1 byte memory中,编译器可能不会给error,但它会overwrite其他字节,所以你不会得到预期结果