它从一个小于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() );
此代码以前工作,但现在看起来很奇怪,似乎我改变了一些导致这种异常的设置?
答案 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'
你已经设法彻底击败任何二进制标头,现在进入数据。查看之前的步骤以验证它们是否正常运行。