带有命令行变量的c++数组

C++ array with command line variable

本文关键字:c++ 数组 变量 命令行      更新时间:2023-10-16

我的数组看起来像这样;

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 };

当我编译时,我得到一个警告;警告:初始化从没有强制类型转换的指针生成整数

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

在第一行你声明一个指向const char的指针,并初始化到字符串"0x05"的开始,这很好,但这不是你想做的事情。

在第二行

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

还要考虑到,如果您正在使用二进制数据(从您使用十六进制数字初始化数组的事实来看),您最好使用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,路易斯。

也许解释一下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'与值0相关联,'1'与值1相关联,依此类推,根据通常的十六进制系统。其次,一旦你得到了一个符号的相关值,你就可以在一些基本的算术运算中使用这些值来计算出由整个符号串表示的数字的值。

例如,如果你有符号'1' '2'和'a',按照从左到右的顺序,那么计算所表示的数字的算法是1 * 16 * 16 + 2 * 16 + 10

错误字符串会告诉你哪里出了问题。

input的类型是const char*(指向const char的指针),而你的数组send_bytes的类型是unsigned char[] (unsigned char数组)。

首先,有符号值和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将字符串转换为整数,要么根本不使用字符串。

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

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 };

你最好把你的代码:

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);