无符号字符数组转换为长长[关闭]
-
21-12-2019 - |
题
我不确定这是否正确,我已经测试过,似乎有些字节是关闭的。..基本上,我有以下内容:
unsigned char szBuffer[1024] = {0};
long long nValue = 1334553536;
memcpy(szBuffer, (char*)&nValue, sizeof(long long));
//
long long nNewValue = reinterpret_cast<long long>(szBuffer);
printf(nNewValue); //prints out a smaller number than previously stated
有人介意指出我错在哪里吗?谢谢!.
解决方案
你在设置 nNewValue
至 szBuffer
, ,而不是从该地址读取数据。使用方法:
long long nNewValue = *reinterpret_cast<long long*>(szBuffer);
其他提示
更改此声明
long long nNewValue = reinterpret_cast<long long>(szBuffer);
到
long long nNewValue = *reinterpret_cast<long long *>(szBuffer);
这是您的程序的修改版本 在我的系统上 (扩展到一个完整的程序):
#include <iostream>
#include <cstring>
int main() {
unsigned char szBuffer[1024] = {0};
long long nValue = 1334553536;
std::memcpy(szBuffer, &nValue, sizeof(long long));
long long nNewValue = *(reinterpret_cast<long long*>(&szBuffer));
std::cout << nValue << "\n" << nNewValue << "\n";
}
memcpy
前两个参数的类型 void*
, ,所以你不需要施放它们;如果你做了强制转换(在C++中不赞成这种转换吗?),你应该投 void*
, ,不 char*
.
分配给 nNewValue
转换 地址 缓冲区的 long long*
, ,然后取消引用转换后的值。
但这是个坏主意。g++给我一个关于转换指针的解引用的警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
此外,也不能保证 szBuffer
, ,这是一个数组 unsigned char
, ,是正确对齐的,所以它的前几个字节可以安全地被视为 long long
对象。您最有可能使用的x86或x86_64系统容忍未对齐的内存访问,但并非所有系统都这样做。
除非您知道,否则指针转换通常是不安全的 就是! 你在做什么。
如果您想将字符数组的一部分重新解释为其他类型的对象,那么如果您确实需要将内存本身解释为不同类型的对象,则可以使用联合,或者使用 memcpy
.(即便如此,请确保您确实需要这样做;很可能你没有。大多数时候,如果你想存储一个 long long
对象,你应该只是 定义 a long long
对象。)
不隶属于 StackOverflow