Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在设备上存储数据_C++ - Fatal编程技术网

C++ 在设备上存储数据

C++ 在设备上存储数据,c++,C++,我没有很多操作/存储二进制数据的经验,因此如果有人能为我澄清一些事情,我将不胜感激 我有一个设备,你必须在那里存储16个字节。e、 例如,您应该向它发送一个字节数组,其中可能包含头信息。e、 例如,smth: unsigned char sendBuffer[255]; sendBuffer[0] = headerInfo1; sendBuffer[1] = headerInfo1; sendBuffer[2] = headerInfo1; sendBuffer[3] = headerInfo1

我没有很多操作/存储二进制数据的经验,因此如果有人能为我澄清一些事情,我将不胜感激

我有一个设备,你必须在那里存储16个字节。e、 例如,您应该向它发送一个字节数组,其中可能包含头信息。e、 例如,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
。我输入
“00000000000000000000000105”
(我不确定程序如何将其解释为十进制或十六进制),然后有以下代码:

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);
}
for(int i=0,m=0;i否则,如果(CH1>=‘a’& & CH1=‘a & & CH1=’a’& & CH2=‘a’& & CH2

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

std::cin>>您的整数
将读取整数,无需自行转换

前导零通常不被写入,但是在C++整数类型中它们总是存在的。例如, It32×T总是有32位。如果它存储105(0x59),它确实存储0x000 000 696/<


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

这里似乎隐藏了一些问题,因此有一些额外的答案:

您说
array1
包含:0000000000000015,而不是
105

它是一个数组,每个成员都以8位整数的形式显示。 最后一个值是5或05,这毕竟是一样的。同样,倒数第二个整数是1或01


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

该代码的用途是什么?为什么不将字符串转换为
int
,然后存储该字符串?或者干脆截断字符串,然后存储该字符串?@OliCharlesworth:好的,我又发现了一个细节。我上面提到的文本框似乎限制用户只输入十六进制值。(此代码是以我在文章中提到的方式将数据写入设备的例程的一部分,例如,
Send
)我也有点困惑。你是说上面的代码按照你想要的方式工作?基本上你只是想解释一下它是如何工作的?这是你似乎在问我的,但我认为这是相当明显的代码是如何工作的。所以我想你应该解释一下什么让你困惑。我想这是关于不同的租用表示和显示整数的方式。@john:是的,john,首先让我们从我提到的文本框开始。据我所知,该文本框强制用户仅以十六进制模式输入16个字节。因此,之后代码被执行。我现在想的是,它基本上将十六进制数据转换为字节数组,对吗?(因为如果我在文本框中输入“000000000000000000000000211”-字节数组
array1
实际上包含“000000000000217”)文本框允许您输入文本(十六进制数字)。代码是文本到二进制的转换。您最终得到的是作为文本输入的数字的二进制形式。(但217不可能是211的二进制表示,这可能是一个输入错误,也可能是一些错误)。嗯……我明白了,如果我有
intx
(也就是说4个字节)。我使用memcpy(data,x,size)-其中数据是
字节数组
。它将正确地“嵌入”字节数组
数据
中我的4字节值
x
对吗?@dmcr\u code如果以这种方式复制,您必须了解endianness。根据平台的endianness和目标设备的endianness,此解决方案可能会执行您想要的操作,也可能不会执行。如果它们不相同,则无法执行此操作。请尝试并查看。@dmcr_代码这种技术的另一个问题是,它不会处理大于平台最大整数大小的整数。据我所知,没有一个平台有16字节的整数,如果需要处理那么大的整数,这种技术将不起作用。嗯……我明白了。没有MSalters要求16字节,但实际存储的是整数不会有这种情况big@john:但在这种情况下,只需使用
int32\u t[4]
。或任何其他适用于您的应用程序的表示形式。实际上不需要16字节整数。我想我已经开始遵循它。看看它。我说我输入了:
00000000000000000000000105
-但这被解释为十六进制。二进制中的105hex是:
“10000001”
。然后我说
数组1
是“0000000000000015”不是
105
对。但是是的,如果我们分别看1和5并将它们转换成二进制,我们得到
0001
0101
——现在它开始看一点像十六进制数105的二进制表示,不是吗?@dmcr_代码:以防万一你没有意识到:十六进制是基数16,即2*2*2。因此,每个十六进制数字都是c转换为正好4位,您可以单独转换每个数字(无溢出)。十进制不是这种情况。好的,MSalters,我想我知道我可以单独转换每个数字。但是当我输入