所以我有以下功能:
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];
有什么想法吗?
答案 0 :(得分:3)
如果char
已在您的编译器中签名(并且很可能是),那么它可能是负数,因此您可以减去一个值而不是添加它,就像this demo所示。
使用unsigned char
或uint8_t
代替char
。