【问题标题】:Convert bytes to integer将字节转换为整数
【发布时间】: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


【解决方案1】:

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

使用unsigned charuint8_t 代替char

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多