Чтение подписанных и неподписанных значений из потока в обоих порядках байтов

#vb.net

#vb.net

Вопрос:

Мне нужно прочитать подписанные и неподписанные 8-битные, 16-битные и 32-битные значения из файлового потока, который может быть младшим по порядку или старшим по порядку (это файл tiff, который содержит индикатор порядка байтов в начале).

Изначально я начал с написания своих собственных функций для чтения значений и смог сделать это для неподписанных значений. например

 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, который позволит мне напрямую считывать подписанные значения, но, похоже, не имеет никакого способа указать, что данные являются порядковыми или порядковыми.

Есть ли хороший способ справиться с этим? В противном случае, может кто-нибудь сказать мне, как преобразовать несколько байтов в значения со знаком (в обоих порядках байтов)?

Ответ №1:

Это не идеально, но вы можете использовать различные перегрузки методов HostToNetworkOrder и NetworkToHostOrder из System.Net.Класс IPAddress для преобразования конечного числа в целое число со знаком.

Ответ №2:

Вы ознакомились с классом BitConverter?

http://msdn.microsoft.com/en-US/library/system.bitconverter_members (v= VS.80).aspx

Некоторая перетасовка байтов и вызов ToUint32 должны дать то, что вы хотите.