我需要从文件流中读取有符号和无符号的8位,16位和32位值,这些文件流可能是little-endian或big-endian(它恰好是一个tiff文件,它在开始时带有字节顺序指示符) )。
我最初是通过编写自己的函数来读取值,并且能够对无符号值执行此操作。 e.g。
Public Function ReadUInt32() As UInt32
Dim b(4) As Byte
input.Read(b, 0, 4)
Dim out As UInt32 = CUInt(If(IsBigEndian, b(0), b(3))) << 24
out += CUInt(If(IsBigEndian, b(1), b(2))) << 16
out += CUInt(If(IsBigEndian, b(2), b(1))) << 8
out += CUInt(If(IsBigEndian, b(3), b(0)))
Return out
End Function
但后来我开始关注已签名的值,我的大脑就崩溃了。
作为替代方案,我找到了IO.BinaryReader,它可以直接读取签名值,但似乎没有任何方法可以表明数据是big-endian或little-endian。
有一种很好的处理方法吗?如果失败了,有人可以告诉我如何将多个字节转换为有符号值(以两个字节顺序)?
答案 0 :(得分:0)
它并不理想,但您可以使用System.Net.IPAddress类中HostToNetworkOrder和NetworkToHostOrder方法的各种重载进行有符号整数字节转换。
答案 1 :(得分:0)
您是否看过BitConverter类?
http://msdn.microsoft.com/en-US/library/system.bitconverter_members(v=VS.80).aspx
一些字节改组和对ToUInt32的调用应该得到你想要的。