memcpy of uint8_t to uint16_t
memcpy of uint8_t to uint16_t
我有一个代码
#include <iostream>
#include <string.h>
using namespace std;
int main() {
// your code goes here
uint8_t x[4] = {55, 11, 0, 20};
uint16_t y;
memcpy(&y, &x[0], 2);
std::cout<<y<<std::endl;
return 0;
}
(55-37的六角,11-B的六角)其中我希望y包含"37B"(即十进制的-891)。但是,Y实际上包含"B37"(即小数中的2871)。如何在没有端交换操作的情况下使用memcpy维护订单。
memcpy
复制内存。它确实维护了内存字节的顺序。你不能让memcpy
做其他事情。
你的问题是你不想复制记忆;你想做一些特定的算术运算(例如,连接两个8位的值以获得一个16位的值)。
整数类型在内存中的具体布局方式是未指定的行为。在您的CPU上,memcpy
破解不会执行您想要的算术运算。因此,要想做你想做的事,就必须做memcpy
之外的事情。
我建议用算术运算来做算术运算:你会得到你可以确信对所有*都有效的代码,而且你的程序很可能会比破解执行得相似(甚至更好),尤其是在启用编译器优化的情况下
*:所有具有相关类型的东西,当然
获得B37
的原因是因为您在一台小型endian机器上。
对memcpy
的调用正在执行您所期望的操作。值0x37
被复制到y
的第一个字节,而0x0B
被复制到y
的第二个字节。因为您使用的是小端体系结构,所以y
的第一个字节是最不重要的。因此它包含值0xB37
。
如果您希望x[0]
是y
的高字节,x[1]
是低字节,您需要以一种不依赖于endianness的方式来实现:
y = x[1]; // y = 0x0B
y |= x[0] << 8; // y = 0x0B | 0x3700 = 0x370B
这将使y
的值为0x370B
。然而,这仍然不是您期望的0x37B
值。
如果这是您想要的,那么您需要认识到0x37B
对于高字节的值为0x03
,对于低字节的值则为0x7B
。
因此,您需要将x
定义如下:
// note the use of hex constants to make the values more clear
uint8_t x[4] = {0x7b, 0x3, 0x0, 0x14};
或者你需要执行一些额外的比特移位来获得你需要的值:
y = x[1]; // y = 0x0B
y |= x[0] << 4; // y = 0x0B | 0x370 = 0x37B
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 从值小于256的uint16到uint8的Endian安全转换
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- OpenGL VBO Indexing ( How to compute Index Array)
- 为什么我会" void value not ignored as it ought to be"?