带命令行变量的C ++数组

时间:2014-08-07 04:49:28

标签: c++ arrays hex

我的数组看起来像这样;

unsigned char send_bytes[] = { 0x0B, 0x11, 0xA6, 0x05, 0x00, 0x00, 0x70 };

其中一个值是一个可以一直改变的变量..所以我尝试了类似的东西;

const char* input = "0x05";
unsigned char send_bytes[] = { 0x0B, 0x11, 0xA6, input, 0x00, 0x00, 0x70 };

当我编译时,我收到警告; 警告:初始化从指针生成整数而没有强制转换

我对我需要做的转换有点困惑..因为数组中有十六进制字符串..输入字符串是一个字符..

5 个答案:

答案 0 :(得分:2)

在第一行中,您声明指向const char,并初始化为字符串"0x05"的开头,这很好,但这不是您要做的事情

在第二行中,您尝试使用在第一行中分配给输入变量的指针值初始化第四个数组元素(unsigned char)。编译器说你假装将指针值("0x05"字符串的地址)嵌入到char变量中,这就是它抱怨的原因。而且这不是你想要的。

另外,考虑到如果您正在使用二进制数据(从初始化数组中使用十六进制数),最好使用unsigned char作为二进制文件,因为signed char仅适用于-128到+127的值,你可以期待一些更不可预测的行为。也许,声明typedef unsigned char byte;可以使事情变得更容易。

typedef unsigned char byte;
byte send_bytes[] = { 0x0b, 0x11, 0xa6, 0x00, 0x00, 0x00, 0x70 };
byte &input = send_bytes[3]; /* input is an alias of send_bytes[3] */

BR, 路易斯

答案 1 :(得分:1)

也许准确地解释const char* input = "0x05";会为你做些什么。

首先,编译器计算字符串数据并将其创建为静态对象:

const char data[5] = { 0x30, 0x78, 0x30, 0x35, 0x0 };

然后初始化您的变量:

const char *input = &data[0];

请注意,input是一个指针,其值完全取决于编译器选择存储字符串数据的位置,并且与字符串的内容无关。因此,如果您说char c = input;,那么c基本上会被分配一个随机数。

所以你应该问自己“我想在send_bytes数组中存储的值0x05在哪里?”在您的代码中,它被编码为文本,而不是您的程序可以直接使用的数字。您需要弄清楚如何将符号的十六进制方案后面的符​​号字符串转换为C ++的本机数字表示。

以下是一些提示。部分操作涉及将值与每个数字符号相关联。符号“0”与值零相关联,“1”与值1相关联,依此类推,根据通常的十六进制系统。其次,一旦你可以得到一个符号的相关值,那么你可以在一些基本算术运算中使用这些值来计算整个符号串所代表的数字的值。

例如,如果您有符号'1''2'和'a',则按从左到右的顺序,然后计算所代表的数字的算术是1 * 16 * 16 + 2 * 16 + 10

答案 2 :(得分:0)

错误字符串几乎可以告诉你究竟是什么错误。

input的类型为const char*(指向const char的指针),而您的数组send_bytes的类型为unsigned char[](无符号字符数组)。 / p>

首先,签名和unsigned值仍然是不同的类型,但您的错误消息并未特别指出。

实际上,您的input值不是string(因为C ++中没有真正的string类型),而是指针到一个人物。这意味着input字符串不包含字节x05,而是字节{x30, x78, x30, x35, x00}

编译器正在说嘿,我不知道你想要做什么,所以我只是转换地址那个字符串我不知道&#理解(input)到unsigned char并将其添加到数组

这意味着如果字符串"0x05"从位置0xAB开始,则您的数组最终将包含{ 0x0B, 0x11, 0xA6, 0xAB, 0x00, 0x00, 0x70 }

您要么必须使用16的基数从字符串转换为整数,要么根本不使用字符串。

我还建议阅读指针。

答案 3 :(得分:0)

数组没有"十六进制字符串"在它中 - 如果它们是,它们将用引号括起来,就像所有字符串一样 文字是用十六进制表示法编写的整数,相当于

unsigned char send_bytes[] = { 11, 17, 166, input, 0, 0, 112 };

由于它是一个unsigned char的数组,你应该在那里放unsigned char

unsigned char input = 0x05;
unsigned char send_bytes[] = { 0x0B, 0x11, 0xA6, input, 0x00, 0x00, 0x70 };

答案 4 :(得分:-1)

你最好输入你的代码:

unsigned char send_bytes[] = { 0x0b, 0x11, 0xa6, 0x00, 0x00, 0x00, 0x70 };
unsigned char &input = send_bytes[3];  /* input is an alias of send_bytes[3] */
通过这种方式,您可以执行以下操作:

input = 0x26;
send_packet(send_bytes);