Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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+中的无符号长字符+;_C++_Pointers_Char - Fatal编程技术网

C++ 将字节数组转换为C+中的无符号长字符+;

C++ 将字节数组转换为C+中的无符号长字符+;,c++,pointers,char,C++,Pointers,Char,我正在从文件中读取二进制数据: char* buffIn = new char[8]; ifstream inFile(path, ifstream::binary); inFile.read(buffIn, 8); 然后我想将char*读入(作为二进制)转换为无符号长字符,但我遇到了一些问题-我不太确定发生了什么,但例如0x00000000000ACD被解释为0xFFFFFFFFCD-我怀疑所有0x00字节在从char*转换为无符号长字符时都会导致某种问题 unsigned long num

我正在从文件中读取二进制数据:

char* buffIn = new char[8];
ifstream inFile(path, ifstream::binary);
inFile.read(buffIn, 8);
然后我想将char*读入(作为二进制)转换为无符号长字符,但我遇到了一些问题-我不太确定发生了什么,但例如0x00000000000ACD被解释为0xFFFFFFFFCD-我怀疑所有0x00字节在从char*转换为无符号长字符时都会导致某种问题

unsigned long number = *(buffIn);

我如何正确地做到这一点

由于
buffIn
属于
char
指针类型,因此当您执行
*(buffIn)
操作时,您只需抓取一个字符。您必须将内存地址重新解释为
无符号长
指针,然后取消对它的引用

unsigned long number = *((unsigned long*)buffIn);

除了重铸
字符[8]
(只读取第一个长度为32位的
无符号长字符),还可以使用一些简单的逐位操作

unsigned long value = (((unsigned long)buffin[0]) << 24) | (((unsigned long)buffin[1]) << 16) | (((unsigned long)buffin[2]) << 8) | (unsigned long)buffin[3];
unsigned long value=(((unsigned long)buffin[0])试试类似的方法

unsigned long* buffInL = new unsigned long[2];
char* buffIn=(char*)buffInL;
ifstream inFile(path, ifstream::binary);
inFile.read(buffIn, 8);

与其他类型不同,char*允许别名。

根据标准,这将是未定义的行为。char指针不必与整数边界对齐。是的,我想这一点在您考虑时是显而易见的。谢谢,我会尽可能接受。@Sundar,它在指向已分配内存时对齐。由标准保证。如果分配的内存大于
unsigned long
当然。@分配内存的尼克开始(使用malloc/calloc)始终与最大可能指针边界对齐(可能是long-long),但不是malloc/calloc未分配的内存。@Sundar,来自标准:
1效果:分配函数(3.7.3.1)由新表达式(5.3.4)调用,以分配适当对齐的存储大小字节,以表示该大小的任何对象。
我想提出一个解决方案,但问题已经解决了。:)此平台上的无符号长字符为64位。它并不意味着是可移植代码:)@adrianmcmenamin那么你也可以做同样的事情,只需更改位移位的系数。