问题描述
|
我需要从文件流中读取带符号和无符号的8位,16位和32位值,该文件流可以是小端(big-endian)或大端(big-endian)(它恰好是tiff文件,其开头带有字节顺序指示符)。
我最初通过编写自己的函数来读取值开始,并且能够对无符号值进行读取。例如
Public Function ReadUInt32() As UInt32
Dim b(4) As Byte
input.Read(b,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,它可以让我直接读取带符号的值,但似乎没有任何方法可以表明数据是大端或小端的。
有解决这个问题的好方法吗?失败了,有人可以告诉我如何将多个字节转换为带符号的值(两个字节顺序)吗?
解决方法
这并不理想,但是您可以使用System.Net.IPAddress类中HostToNetworkOrder和NetworkToHostOrder方法的各种重载来进行有符号整数字节序转换。
,您是否看过BitConverter类?
http://msdn.microsoft.com/zh-CN/library/system.bitconverter_members(v=VS.80).aspx
一些字节改组和对ToUInt32的调用应该得到您想要的。