Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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++,我通过USB协议从远程设备获取字节。这些字节包含整数数据。以下代码是一种安全的解包方式,不会出现可移植性问题(已知的endianess除外): #包括 #包括 #包括 #包括 int main() { std::uint8_t someArray[4]={1,0,0,0}; std::int32\u t someValue=0; std::memcpy(&someValue,someArray,4); std::cout是 std::memcpy确实是一条可行之路。在现实代码中,我会static

我通过USB协议从远程设备获取字节。这些字节包含整数数据。以下代码是一种安全的解包方式,不会出现可移植性问题(已知的endianess除外):

#包括
#包括
#包括
#包括
int main()
{
std::uint8_t someArray[4]={1,0,0,0};
std::int32\u t someValue=0;
std::memcpy(&someValue,someArray,4);
std::cout是


std::memcpy
确实是一条可行之路。在现实代码中,我会
static\u assert
检查所使用类型的大小,并在运行时检查数据大小,但仅此而已。

这可能行得通,但就我个人而言,我会通过手动汇编八位字节的结果来同时解决尾数和转换问题。你知道它的32位.Y你知道它(显然)可能是有符号的(这是唯一让它有点棘手的部分),我假设你知道包装器(即发送此信息的设备)是否以网络和主机顺序(即它总是在总线上)将其发送到总线上。鉴于所有这些,将八位字节组合成32位结果应该很简单。
#include <iostream>
#include <string>
#include <cstdint>
#include <cstring>

int main()
{
  std::uint8_t someArray[4] = {1,0,0,0};
  std::int32_t someValue = 0;
  std::memcpy(&someValue, someArray, 4);
  
  std::cout << someValue << std::endl;
}