C#-BigEndian的二进制阅读器?我试图通过使用一个程序来读取所有不同的信息来提高我对STFS文件格式的理解。使用网站来引用哪些偏移量包含哪些信息,我编写了一些代码,其中包含一个二进制读取器,该读取器遍历文件并将值放入正确的变量中。问题是所有数据都支持BigEndian,二进制读取器读取的所有内容都是LittleEndian。那么,解决这个问题的最佳方法是什么?我可以创建一个返回反向字节数组的二进制读取器的模拟类吗?有什么我可以在类实例中更改,使其读取大端,这样我就不必重写所有内容了吗?任何帮助表示赞赏。编辑:我尝试添加Encoding.BigEndianUnicode作为参数,但它仍然读取小端。我通常不回答我自己的问题,但我用一些简单的代码完成了我想要的:vardata=base.ReadBytes(4);Array.Reverse(数据);返回BitConverter.ToInt32(数据,0);}publicInt16ReadInt16(){vardata=base.ReadBytes(2);大批。反向(数据);返回BitConverter.ToInt16(数据,0);}publicInt64ReadInt64(){vardata=base.ReadBytes(8);Array.Reverse(数据);返回BitConverter.ToInt64(数据,0);}publicUInt32ReadUInt32(){vardata=base.ReadBytes(4);Array.Reverse(数据);返回BitConverter.ToUInt32(数据,0);我知道这就是我想要的,但我不知道如何写。我找到了这个页面,它有帮助:http://www.codekeep.net/snippets/870c4ab3-419b-4dd2-a950-6d45beaf1295.aspx恕我直言,这是一个稍微好一点的答案,因为它不需要创建不同的类使big-endian调用明显,并允许big-endian和little-endian调用在流中混合。publicstaticclassHelpers{//注意这个MODIFIESTHEGIVENARRAY然后返回对修改后的数组的引用。publicstaticbyte[]Reverse(thisbyte[]b){Array.Reverse(b);返回b;}publicstaticUInt16ReadUInt16BE(thisBinaryReaderbinRdr){returnBitConverter.ToUInt16(binRdr.ReadBytesRequired(sizeof(UInt16)).Reverse(),0);}publicstaticInt16ReadInt16BE(thisBinaryReaderbinRdr){returnBitConverter.ToInt16(binRdr.ReadBytesRequired(sizeof(Int16)).Reverse(),0);}publicstaticUInt32ReadUInt32BE(thisBinaryReaderbinRdr){returnBitConverter.ToUInt32(binRdr.ReadBytesRequired(sizeof(UInt32)).Reverse(),0);}publicstaticInt32ReadInt32BE(thisBinaryReaderbinRdr){returnBitConverter.ToInt32(binRdr.ReadBytesRequired(sizeof(Int32)).Reverse(),0);}publicstaticbyte[]ReadBytesRequired(thisBinaryReaderbinRdr,intbyteCount){varresult=binRdr.ReadBytes(byteCount);if(result.Length!=byteCount)抛出新的EndOfStreamException(string.Format("流中需要{0}个字节,但只返回{1}个字节。",byteCount,result.Length));返回结果;我不熟悉STFS,但更改字节序相对容易“网络顺序”是大端,所以您需要做的就是从网络顺序转换为主机顺序。这很容易,因为已经有代码可以做到这一点。看看此处所述的IPAddress.NetworkToHostOrder:ntohs()和ntohl()等效?在我看来,你要小心这样做。人们想要从BigEndian转换为LittleEndian的原因是,如果正在读取的字节在BigEndian中,并且它们的操作系统计算在LittleEndian中运行。C#不再是一种仅限Windows的语言。使用Mono等端口,以及WindowsPhone7/8、Xbox360/XboxOne、WindwosCE、Windows8Mobile、带MONO的Linux、带MONO的Apple等其他Microsoft平台。运行平台很可能是BigEndian,在这种情况下,如果不做任何检查就转换代码,那就是在搞砸自己。BitConverter上已经有一个名为“IsLittleEndian”的字段,您可以使用它来确定操作环境是否在LittleEndian中。然后你可以有条件地做反向。因此,我实际上只是写了一些字节[]扩展而不是创建一个大类://////从源字节数组中的一个点获取字节数组并反转字节。请注意,如果当前平台不在LittleEndian中,则假定输入数组为BigEndian,并且字节不会以相反的顺序返回//////要获取反转字节的源数组///源数组中的索引从哪里开始反转///要反转的字节数///包含反转字节的新数组,或未反转的数组的子集。publicstaticbyte[]ReverseForBigEndian(thisbyte[]byteArray,intstartIndex,intcount){if(BitConverter.IsLittleEndian)returnbyteArray.Reverse(startIndex,count);}否则返回byteArray.SubArray(startIndex,count);}publicstaticbyte[]Reverse(thisbyte[]byteArray,intstartIndex,intcount){byte[]ret=newbyte[count];对于(inti=startIndex+(count-1);i>=startIndex;--i){byteb=byteArray[i];ret[(startIndex+(count-1))-i]=b;返回ret;}publicstaticbyte[]SubArray(thisbyte[]byteArray,intstartIndex,intcount){byte[]ret=newbyte[count];for(inti=0;i想象一下这个示例代码:以上就是C#学习教程:C#-BinaryReaderforBigEndian?全部内容分享,如果对大家有用需要进一步了解C#学习教程,希望大家多多关注---byte[]fontBytes=byte[240000];//这里加载了一些数据,EG一个TTFTrueTypeCollection字体文件。(在BigEndian中)int_ttcVersionMajor=BitConverter.ToUint16(fontBytes.ReverseForBigEndian(4,2),0);//output_ttcVersionMajor=1//TCCHeader为version1本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如有转载请注明出处:
