#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 должны дать то, что вы хотите.