0

我在二进制数据的操作/存储方面没有太多经验,所以如果有人能为我澄清一些事情,我将不胜感激。

我有一个设备说你必须在哪里存储 16 个字节。例如,您应该向它发送一个可能带有标头信息的字节数组。例如,像这样:

unsigned char sendBuffer[255];
sendBuffer[0] = headerInfo1;
sendBuffer[1] = headerInfo1;
sendBuffer[2] = headerInfo1;
sendBuffer[3] = headerInfo1;
sendBuffer[4] = data;
sendBuffer[5] = data;
sendBuffer[6] = data;
sendBuffer[7] = data;
sendBuffer[8] = data;
...
sendBuffer[20] = data;

假设发送操作很简单,您只需使用Send(sendBuffer, length).

我的问题是说我想在设备中存储一个整数- 最好的方法是什么?

我有一个示例代码可以做到这一点,但我不确定它是否可以以及它是如何做到的。这也让我很困惑。我基本上在文本框中输入要存储的数字。假设我想以105十进制存储。我输入"00000000000000000000000000000105"(我不确定程序如何将其解释为十进制或十六进制),然后有以下代码:

for(int i=0,m=0; i < size; i+=2,m++)
{
char ch1, ch2;
ch1=(char)str[i]; // str contains the number I entered above as string, padded
ch2=(char)str[i+1];
int dig1, dig2;
if(isdigit(ch1)) dig1 = ch1 - '0';
else if(ch1>='A' && ch1<='F') dig1 = ch1 - 'A' + 10;
else if(ch1>='a' && ch1<='f') dig1 = ch1 - 'a' + 10;
if(isdigit(ch2)) dig2 = ch2 - '0';
else if(ch2>='A' && ch2<='F') dig2 = ch2 - 'A' + 10;
else if(ch2>='a' && ch2<='f') dig2 = ch2 - 'a' + 10;

// Contains data to write as a byte array; this is basically the 'data' part as mentioned in my above snippet
array1[m] = (char)(dig1*16 + dig2);
}

array1[m]使用上述方法将其写入设备Send。但是当我调试array1包含:0000000000000015

当我读取时,我得到的值是正确的,它是00000000000000000000000000000105. 这怎么行?

4

2 回答 2

0

您在这里重新发明了一些轮子,但如果您是 C++ 新手,这是可以预料的。

std::cin >> yourInteger将读取一个整数,无需自己转换。

前导零通常不会写出,但在 C++ 整数类型中它们始终存在。例如int32_t,总是有 32 位。如果它存储了 105 (0x69),它实际上存储了 0x00000069。

因此,最好的方法可能是memcpy将该整数添加到您的sendBuffer. 您应该复制sizeof(yourInteger)字节。

于 2013-09-19T07:22:58.980 回答
0

似乎这里隐藏了一些问题,所以一些额外的答案:

你说array1包含:0000000000000015,不是105

嗯,它是一个数组,每个成员本身都显示为一个 8 位整数。例如最后一个值是 5 或 05,毕竟是一样的。同样,倒数第二个整数是 1 或 01。

您还写了“假设我想以十进制存储 105。我输入00000000000000000000000000000105”。这实际上并不存储十进制的 105。它存储 105 十六进制,即 261 十进制。确定最终值的是字符串到整数的转换。如果您使用基数 18(八进制),则字符串“105”变为整数 1*18*18 + 0 + 5 = 329(十进制),并将存储为 000000101001001 二进制。

于 2013-09-19T07:59:59.750 回答