我对二进制数据的操作/存储经验不多,所以如果有人能为我澄清一些事情我会非常感激。
我有一个设备说你必须存储16个字节。例如,你应该向它发送一个字节数组,可能带有标题信息。例如,像这样的smth:
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
。怎么运作?
答案 0 :(得分:0)
你在这里重新启动了几个轮子,但如果你是C ++的新手,这是可以预期的。
std::cin >> yourInteger
将读取整数,无需自行转换。
通常不会写出前导零,但在C ++整数类型中它们总是存在。例如。 int32_t
总是有32位。如果它存储105(0x69),它实际上存储0x00000069。
因此,最好的方法可能是memcpy
整数到sendBuffer
。您应该复制sizeof(yourInteger)
个字节。
答案 1 :(得分:0)
似乎隐藏在这里有一些问题,所以有一些额外的答案:
你说array1
包含:0000000000000015,而不是105
。
嗯,这是一个数组,每个成员本身都显示为8位整数。 例如。最后一个值是5或05,毕竟是相同的。同样,倒数第二个整数是1或01.
您还写道:“我想以十进制存储105个。我输入00000000000000000000000000000105
”。这实际上并不存储105十进制数。它存储105个十六进制,即十六进制261。它是字符串到整数的转换,它决定了最终的值。如果你使用base 18(octodecimal),字符串“105”将变为整数1 * 18 * 18 + 0 + 5 = 329(十进制),并且将存储为000000101001001 binary。