BinaryReader ReadInt32()返回一个太大的数字

时间:2014-09-09 03:21:32

标签: binaryreader

它从一个小于2k的.eml文件的文件中读取。   你猜怎么着? msgCount是1717924456为什么ReadInt32返回那么大?

         protected void Load( Stream msgStream )
    {
        if( msgStream == null )
            throw new ArgumentNullException( "messageStream" );
        BinaryReader bsr = new BinaryReader( msgStream );
        MailAddress  = bsr.ReadString();
        MailUser     = bsr.ReadString();
        MailServer   = bsr.ReadString();
        UseSsl       = bsr.ReadBoolean();
        MailPort     = bsr.ReadInt32();
        MailPassword = bsr.ReadString();
        int i, msgCount = bsr.ReadInt32();
        for( i = 0; i < msgCount; i++ )
        {
            int msgLen = bsr.ReadInt32();
            MessageExt msg = new MessageExt( bsr.ReadBytes( msgLen ) );
            msg.RecvTime = DateTime.FromBinary( bsr.ReadInt64() );

此代码以前工作,但现在看起来很奇怪,似乎我改变了一些导致这种异常的设置?

3 个答案:

答案 0 :(得分:2)

1717924456 == 0x66657268看起来很像英文字符的ASCII十六进制代码。

假设有一个小端处理器,它对应于字符串“href”(0x68,0x72,0x65,0x66)。因此,您可能会从错误的地址(即来自邮件正文)进行阅读。

使用十六进制编辑器手动验证文件的内容并确保它没有损坏。

答案 1 :(得分:1)

文件中的

ReadInt32 reads a 32-bit signed integer并返回该文件。 声音就像你期望它返回读取的字节数(基于你担心文件只有2K长) - 这不是它的作用。

如果文件的前四个八位字节是一个非常大的32位有符号数,那就是你所看到的。如果您希望看到较小的数字(因为您认为前四个字节实际上包含消息计数),请参阅下文。


有趣的是,您所获得的价值是我期望以文本文件格式看到的,但不是必然符合RFC822的电子邮件文件。

数字1,717,924,456是十六进制0x66657268,转换为ASCII字符ferh

反转(由于平台的字节顺序),href应该立刻熟悉那些精通网络的人群。{{1}}我建议您在自己喜欢的文本编辑器中打开文件,并查看前四个字符是什么。

答案 2 :(得分:1)

>>> hex(1717924456)
'0x66657268'
>>> '\x66\x65\x72\x68'
'ferh'

你已经设法彻底击败任何二进制标头,现在进入数据。查看之前的步骤以验证它们是否正常运行。