'Пытаемся вытащить данные!
FileNumber = FreeFile
Open pathLWork & "\" & "TEST.TEST" For Binary As #FileNumber
Do While Not EOF(1)
Get #FileNumber, , FileBuffer
Debug.Print FileBuffer
Loop
Close #FileNumber
FileNumber = FreeFile
Open pathLWork & "\" & "TEST.TEST" For Binary As #FileNumber
FileBuffer =space(lof(FileNumber))
Get #FileNumber, , FileBuffer
Debug.Print FileBuffer
Close #FileNumber
Private Sub Form_Load()
Dim FileBuffer As String, FileNumber As Long
FileNumber = FreeFile
Open "C:\boot.ini" For Binary As #FileNumber
FileBuffer = Space(LOF(FileNumber))
Get #FileNumber, , FileBuffer
Debug.Print FileBuffer
Close #FileNumber
End Sub
Private Sub Form_Load()
Dim FileBuffer() As Long, FileNumber As Long
FileNumber = FreeFile
Open "file" For Binary As #FileNumber
redim FileBuffer(LOF(FileNumber)\4)
Get #FileNumber, , FileBuffer
Debug.Print FileBuffer(0)
Close #FileNumber
End Sub
Function GetInteger(FirstByte, SecondByte As Byte)
Dim number As Long
number = CLng(FirstByte) + CLng(SecondByte) * 256
If number > 32767 Then number = number - 65536
GetInteger = CInt(number)
End Function
Function GetSingle(FirstByte, SecondByte, ThirdByte, FourthByte As Byte)
Dim number As Double
number = CDbl(FirstByte) + CDbl(SecondByte) * 256 + CDbl(ThirdByte) * 256 ^ 2 + CDbl(FourthByte) * 256 ^ 3
If number > 2147483647 Then number = number - 4294967296#
GetSingle = CLng(number)
End Function
eagle-dwarf писал(а):Кстати, разгадывать 16-ричный код блокнотом жутко не удобно. Возьми любой редактор 16-ричного кода (hex-редактор). я очень быстро нашел в сети такой, который меня устроил. (WINHEX 12.2 русифицированный) могу скинуть тебе его на мыло - весит что-то вроде 700кб.
eagle-dwarf писал(а):Далее, что касается пробелов то это код hex (20) если читать файл побайтно с проверкой содержания байта то можно просто вычислять такие байты и неучитывать при дальнейшем использовании.
Кроме того я не думаю что они уж совсем незакономерно расположены - скорее всего они маркируют конец (или начало) какой-то логически связанной записи.
Function GetInteger(FirstByte As Byte, SecondByte As Byte) As Integer
Dim number As Integer
If SecondByte < 128 Then
number = FirstByte + SecondByte * 256
Else
number = FirstByte + (SecondByte - 256) * 256
End If
GetInteger = number
End Function
Function GetLong(FirstByte As Byte, SecondByte As Byte, ThirdByte As Byte, FourthByte As Byte) As Long
Dim number As Long
If FourthByte < 128 Then
number = FirstByte + SecondByte * 256 + ThirdByte * 256 ^ 2 + FourthByte * 256 ^ 3
Else
number = FirstByte + SecondByte * 256 + ThirdByte * 256 ^ 2 + (FourthByte - 256) * 256 ^ 3
End If
GetLong = number
End Function
Function GetSingle(FirstByte As Byte, SecondByte As Byte, ThirdByte As Byte, FourthByte As Byte) As Single
Dim number As Single
Dim SignOfNumber As Integer
Dim Order As Integer
'Определение знака числа
If FourthByte < 128 Then 'Проверка знака числа
SignOfNumber = 1
Else
SignOfNumber = -1
FourthByte = FourthByte - 128 'убираем из байта бит отвечающий за знак
End If
'Вычисление кода порядка - смещаем-увеличиваем порядок на один разряд т.к для порядка используется еще один бит (всего их 8) из следующего байта
Order = 2 * FourthByte
'Коррекция кодов порядка и мантиссы
If ThirdByte > 127 Then
Order = Order + 1 ' если в том бите который в третьем байте отвечает за порядок есть 1 то соответственно прибавляем его к поярядку
ThirdByte = ThirdByte - 128 'вычитаем значение этого бита из байта
End If
'Коррекция нормализованной мантиссы
If Order > 0 Then
ThirdByte = ThirdByte + 128 'добавляем разряд - кажись это связано с тем что число высчитывается как 2точкаДробная, часть а записано оно как 0точка2Дробная часть
End If
'Вычисление мантиссы
' number = ((FirstByte / 256 + SecondByte) / 256 + ThirdByte) / 256
number = ThirdByte * 256 ^ -1 + SecondByte * 256 ^ -2 + FirstByte * 256 ^ -3
'Вычисление модуля числа
If Order > 126 Then
For I = 1 To Order - 126
number = number * 2
Next I
Else
For I = 1 To 126 - Order
number = number / 2
Next I
End If
'Коррекция знака числа
If SignOfNumber < 0 Then
number = -number
End If
GetSingle = number
End Function
Function GetDouble(FirstByte As Byte, SecondByte As Byte, ThirdByte As Byte, FourthByte As Byte, b5 As Byte, b6 As Byte, b7 As Byte, b8 As Byte) As Double
Dim number As Double
Dim SignOfNumber As Integer
Dim Order As Integer
Dim Temp As Integer
'Определение знака числа
If b8 < 128 Then 'Проверка знака числа
SignOfNumber = 1
Else
SignOfNumber = -1
b8 = b8 - 128
End If
Order = 16 * b8 'Вычисление кода порядка - смещаем-увеличиваем порядок на 4 разряда т.к для порядка используется еще 4 бит (всего их 11) из следующего байта
'Коррекция кодов порядка и мантиссы записанных в следующем байте
If b7 > 15 Then
Temp = CInt(b7) 'временно сохраняем первоначальное значение седьмого байта
Do
b7 = b7 - 16
Loop While b7 > 15 'полученое число соответствует 4 младшим битам в байте и относится к мантиссе
Order = Order + (Temp - CInt(b7)) / 16 ' если в в четырех страших битах этого байта есть отличное от 0 число то оно относится к порядку значит его нужно перевести в 4 малдших байта и прибавить к порядку
End If
If Order > 0 Then 'добавляем разряд
b7 = b7 + 16
End If
'вычисление мантиссы
number3 = b7 * 256 ^ -1 + b6 * 256 ^ -2 + b5 * 256 ^ -3 + FourthByte * 256 ^ -4 + ThirdByte * 256 ^ -5 + SecondByte * 256 ^ -6 + FirstByte * 256 ^ -7
'вычисление модуля числа
If Order > 1019 Then 'по какой-то причине в порядке отсутствует разряд по идее порядок должен быть больше 1021 но с 1021 не работает а с 1019 все отлично, мож объяснит кто?
Order = Order - 1019
For I = 1 To Order
number = number * 2
Next I
Else
For I = 1 To 1019 - Order
number = number / 2
Next I
End If
'Коррекция знака числа
If SignOfNumber < 0 Then
number = -number
End If
GetDouble = number
End Function
private type bytes
b1 as byte
b2 as byte
b3 as byte
b4 as byte
end type
private type float
f as single
end type
sub asdf
dim b as bytes, f as float
b.b1=1
b.b2=2
b.b3=3
b.b4=4
lset f=b
msgbox f.f
end sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30