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那么你也可以做同样的事情,只需更改位移位的系数。