C++ 在C++;,如何将文件正确加载到比char数据类型更宽的数组中?

C++ 在C++;,如何将文件正确加载到比char数据类型更宽的数组中?,c++,C++,具体地说,我正在尝试用二进制文件对FPGA进行编程。事务寄存器的宽度为16位。所以我需要创建一个uint16_t数组,并用一个输入文件填充它。以下是我尝试过的: int bufferSize = 512; uint16_t buffer[bufferSize]; std::ifstream *pStream = new std::ifstream( filepath ); if( pStream->is_open() == true ) { pStream->read( (ch

具体地说,我正在尝试用二进制文件对FPGA进行编程。事务寄存器的宽度为16位。所以我需要创建一个uint16_t数组,并用一个输入文件填充它。以下是我尝试过的:

int bufferSize = 512;
uint16_t buffer[bufferSize];
std::ifstream *pStream = new std::ifstream( filepath );
if( pStream->is_open() == true )
{
   pStream->read( (char *)buffer, bufferSize );
}

从GDB中我可以看出,似乎每个数组节点都是向后的(即预期的0xBEEF,得到的0xEFBE)

似乎遇到了endianness问题。您可能需要使用
htons()。(在数组的每个元素上使用它,例如,使用循环或
std::transform
)。有关更多详细信息,请参阅。

您似乎遇到了一个endianness问题。您可能需要使用
htons()。(在数组的每个元素上使用它,例如,使用循环或
std::transform
)。有关更多详细信息,请参阅。

这些工具有Unix背景,big-endian也不太可能。不过要小心。如果数据的最终目的地与输入相同,则可能不希望对其进行转换。我不知道细节,但是如果文件被加载到一个数组中并推送给程序员,请仔细检查文件源和程序员对endian的使用。需要进行Big-endian交换。谢谢。这些工具有Unix背景,big-endian也不太可能。不过要小心。如果数据的最终目的地与输入相同,则可能不希望对其进行转换。我不知道细节,但是如果文件被加载到一个数组中并推送给程序员,请仔细检查文件源和程序员对endian的使用。需要进行Big-endian交换。谢谢你,顺便说一句:
如果(pStream->is_open()==true)
有点冗长。@TonyK同意。我受到了编码风格的限制:P它也让我讨厌。“If is open”听起来很明确。您还应该使用
pStream->read((char*)缓冲区,bufferSize*sizeof(uint16_t))否则,您将只写入预期写入的数据的一半。但真正的问题当然是大的还是小的,正如下面所建议的。谢谢米凯尔。我得到的数据确实比预期的少。顺便说一句:
如果(pStream->is_open()==true)
有点冗长。@TonyK同意。我受到了编码风格的限制:P它也让我讨厌。“If is open”听起来很明确。您还应该使用
pStream->read((char*)缓冲区,bufferSize*sizeof(uint16_t))否则,您将只写入预期写入的数据的一半。但真正的问题当然是大的还是小的,正如下面所建议的。谢谢米凯尔。我得到的数据确实比预期的少。