将字节转换为整数

时间:2014-10-14 07:14:56

标签: c++ endianness typeconverter

所以我有以下功能:

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]; 

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

如果char已在您的编译器中签名(并且很可能是),那么它可能是负数,因此您可以减去一个值而不是添加它,就像this demo所示。

使用unsigned charuint8_t代替char