C ++如何将字节读取为独立于整数字节序的?
C++ How to read Bytes as Integer endianness independent?
我想读取文件的一些字节作为整数值。例如,文件包含等于 955 的值 0x000003BB
。
我可以这样读取数据:
ifstream input ("C:/Desktop/myFile", ios::binary);
uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));
但是如何将缓冲区数组转换为相应的整数值 955?如果可能的话,以一种独立于字节序的方式,因为这个文件和其他一些文件是大字节序的,但我的系统是小字节序的。谢谢:)
我不确定这是最好的解决方案,但它确实有效。
uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));
unsigned int result = buffer[0];
result = (result << 8) | buffer[1];
result = (result << 8) | buffer[2];
result = (result << 8) | buffer[3];
不需要使用uint8_t
的数组,直接读入一个4字节整数即可:
uint32_t data;
input.read((char*)&data, sizeof(data));
编辑:
此代码适用于我的 VC++ 编译器:
#include<stdint.h>
#include<intrin.h>
#include<iostream>
int main()
{
uint32_t data;
data = 0xBB030000;
data = _byteswap_ulong(data);
std::cout << data;
}
如果您使用的是 GCC,则需要将 _byteswap_ulong
替换为 __builtin_bswap32
。如果您需要独立代码,则需要自己编写代码(可能在这些编译器内部函数之上)。
如果您的 OS 支持 POSIX 或者是 windows,那么您可以使用 ntohl
:
int data;
input >> data;
data = ntohl(data);
我想读取文件的一些字节作为整数值。例如,文件包含等于 955 的值 0x000003BB
。
我可以这样读取数据:
ifstream input ("C:/Desktop/myFile", ios::binary);
uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));
但是如何将缓冲区数组转换为相应的整数值 955?如果可能的话,以一种独立于字节序的方式,因为这个文件和其他一些文件是大字节序的,但我的系统是小字节序的。谢谢:)
我不确定这是最好的解决方案,但它确实有效。
uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));
unsigned int result = buffer[0];
result = (result << 8) | buffer[1];
result = (result << 8) | buffer[2];
result = (result << 8) | buffer[3];
不需要使用uint8_t
的数组,直接读入一个4字节整数即可:
uint32_t data;
input.read((char*)&data, sizeof(data));
编辑:
此代码适用于我的 VC++ 编译器:
#include<stdint.h>
#include<intrin.h>
#include<iostream>
int main()
{
uint32_t data;
data = 0xBB030000;
data = _byteswap_ulong(data);
std::cout << data;
}
如果您使用的是 GCC,则需要将 _byteswap_ulong
替换为 __builtin_bswap32
。如果您需要独立代码,则需要自己编写代码(可能在这些编译器内部函数之上)。
如果您的 OS 支持 POSIX 或者是 windows,那么您可以使用 ntohl
:
int data;
input >> data;
data = ntohl(data);