【发布时间】:2014-10-14 07:14:55
【问题描述】:
所以我有以下功能:
void SomeClass::Read(__in uint32_t& Res)
{
ReadBinary<uint32_t>(Res);
}
template < typename T >
void SomeClass::ReadBinary(T& Res)
{
size_t sBytesToRead = sizeof(T);
Res = 0;
std::vector<char> vcBuffer(sBytesToRead);
m_Fstream.read(&vcBuffer[0], sBytesToRead);
// little endian
if (m_Endian == LITTLE_ENDIAN)
for (int n = sBytesToRead-1; n >= 0; n--)
Res = (Res << 8) + vcBuffer[n];
// big endian
else
for (unsigned n = 0; n < sBytesToRead; n++)
Res = (Res << 8) + vcBuffer[n];
}
void SomeClass::DetectEndian()
{
int num = 1;
if (*(char *)&num == 1)
m_Endian = LITTLE_ENDIAN;
else
m_Endian = BIG_ENDIAN;
}
这些函数旨在检测系统字节序并从文件中读取二进制整数。
由于某种原因,我没有得到预期值。我怎么知道?我写了一个简单的python脚本:
mode = 'rb'
with open(filename, mode) as f:
print struct.unpack('i', f.read(4))[0]
print struct.unpack('i', f.read(4))[0]
似乎当整数很小以包含在单个字节中时,两个程序的值是相同的。但是,一旦整数由多个字节组成,我会得到不同的值。
这让我认为我对这些行有问题:
// little endian
if (m_Endian == LITTLE_ENDIAN)
for (int n = sBytesToRead-1; n >= 0; n--)
Res = (Res << 8) + vcBuffer[n];
有什么想法吗?
【问题讨论】:
-
你得到什么值,什么输入?
标签: c++ endianness typeconverter