如何在 lpBuffer 中转换和连接位置以最终以打印为整数的十六进制数结束?



我是C++新手。

我已经引用了 10+ 堆栈溢出页面引用了类似的问题,但无论我尝试什么,我都无法推断出适合我特定问题的解决方案。

我有一些电子设备将数据馈送到串行端口,其中的正确性通过RealTerm和XCTU进行验证。(长话短说,我知道发送到端口的数据是正确的(

我正在使用 CreateFile((/dcb 访问串行端口。(我相当确定端口设置代码是正确的,但如果您想查看代码以验证自己,请告诉我((如果使用其他方法访问串行端口可以解决此问题,请告诉我(

我在端口上执行的唯一操作是 ReadFile((。 ReadFile(( 调用使用的 lpBuffer 被设置为 char[]。 我不知道为什么,但似乎 char[] 的每个索引只接受一个字节的信息。 出于调试目的,我使用:

cout << hex << setfill('0') << setw(2) ...

这样它就会像这样打印出来到控制台:

lpBuffer in [...] = ...
lpBuffer in [11] = 03
lpBuffer in [12] = ff
lpBuffer in [...] = ...

我想使用连接两个字符串的概念,以便我得到:

03次 (1023(

我也更喜欢将"串联"值存储在变量中的答案,而不更改存储在 lpBuffer/char[] 中的信息(不是字面意思连接它(,并将值存储为整数。

我尝试使用sprintf_s((,字符串流,转换为字符串并使用stoi。 我找到的最接近的答案似乎不适用于 lpBuffers(char[] 保存字节数据而不是实际字符?(,并且还转换数组的所有索引,而不仅仅是特定的索引。

请帮忙,C++巫师们!

尽管它的某些内容有点丑陋,但您通常想要做的是定义一个结构来描述您期望的数据。例如,假设您的数据是两个长整型(4 字节项(后跟两个短整型(2 字节项(。

#pragma pack(1);
struct my_input {
long data1;
long data2;
short data3;
short data4;
// more stuff here
};

然后,当您读取充满数据的缓冲区时,可以强制转换如下内容:

my_input *in = (my_input *)&buffer[0];

然后,您可以通过该结构的镜头查看数据(可以这么说(,并查看要存在的类型:

std::cout << in->data4;

在这种特殊情况下,您还有另一个小转折需要处理:您接收的数据显然是大端顺序或(有时称为(网络顺序。幸运的是,普通的网络库提供了一些函数来将网络顺序数据转换为您为其编译它的处理器使用的数据,因此(在本例中(您需要这样的东西:

std::cout << ntohs(in->data4);

"短"(16 位(值有ntohs,长(32 位(和(在大多数当前网络堆栈中(长(64 位(值ntohllntohl

请注意pragma pack(1)。它告诉编译器不要在字段之间插入任何额外的填充。当您尝试匹配外部定义的结构时,如果那里有任何填充,您通常希望显式插入它,而不是相信编译器会将其插入到您想要的位置。

最新更新