1

当我从文件中读取原始字节时,我正在读取文件的标题并使用(左移)和(或)wav填充我的类成员。现在,巧合的是,我遇到了以下情况 ,其中is of type和is of所以我可以使用.<<|
uBytesPerSecondunsigneddatachar*std::fstream::read

现在当我uBytesPerSecond在调试器中创建

this->uBytesPerSecond |= data[0x1F]; //0x00 ->uBytesPerSecond = 0x00000000
this->uBytesPerSecond <<= 8;         //     ->uBytesPerSecond = 0x00000000
this->uBytesPerSecond |= data[0x1E]; //0x02 ->uBytesPerSecond = 0x00000002
this->uBytesPerSecond <<= 8;         //     ->uBytesPerSecond = 0x00000200
this->uBytesPerSecond |= data[0x1D]; //0xb1 ->uBytesPerSecond = 0xffffffb1 !!!
this->uBytesPerSecond <<= 8;         //     ->uBytesPerSecond = 0xffffb100
this->uBytesPerSecond |= data[0x1C]; //0x10 ->uBytesPerSecond = 0xffffb110

在这种情况下,预期的输出是uBytesPerSecond = 0x00002b110。请告诉这里发生了什么以及我如何解决这个问题。

我正在使用MSVC2012Windows 8,这是一个应用程序VC++-Console

4

2 回答 2

6

问题是您的平台char是签名类型。因此,包含的值将被符号扩展到 32 位以进行 or 操作,从而为您0xffffffb1提供data[0x1D].

要解决这个问题,只需将类型更改dataunsigned char*

编辑:如评论中所述,该问题的另一种解决方案是使用0xFF:this->uBytesPerSecond |= data[0x1F] & 0xFF等显式屏蔽操作数​​。

于 2013-04-21T13:07:40.487 回答
1

为什么不使用联合而不是使用按位或移位?就像是

union ByteWord
{
    unsigned int word;
    char bytes[sizeof(unsigned int)];
}

然后你可以做

ByteWord data;
myStream.read(data.bytes, sizeof(unsigned int));
this->uBytesPerSecond = myStream.word;

ntohl(myStream.word)如果您需要字节交换,请使用它。

于 2013-04-21T13:25:31.940 回答