以两个字节顺序从流中读取有符号和无符号值

时间:2011-05-23 21:47:03

标签: vb.net

我需要从文件流中读取有符号和无符号的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。

有一种很好的处理方法吗?如果失败了,有人可以告诉我如何将多个字节转换为有符号值(以两个字节顺序)?

2 个答案:

答案 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的调用应该得到你想要的。