Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Прочитать из Binary файла числа float... Добавлено: 03.05.06 17:24  

Автор вопроса:  SL
Как прочитать из Binary файла такие данные (VB 6.0) -
заголовок (комментарии - 80 байт),
затем число 4 байта интерпретируются как long integer,
а после этого ряд повторяющихся групп записей по 50 байт:
4 группы по 3 числа (4x12 байт = 48, каждые 4 байта интерпретируются как число float) + разделитель 2 байта.

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 03.05.06 17:39
Хм... Ну смотря для чего это надо. Просто тупо прочитать из Binary, то сперва заголовок как динамический массив 80 as Byte, затем один long, повторяющиеся группы также можно читать как (50) as Byte, только их число знать надо, если это фиксированная структура - лучше через нее, ну и массив из 12 single, или 4 массива по 3 single :)
Сказал бы конкретнее - можно было бы наклепать код.

Ответить

Номер ответа: 2
Автор ответа:
 SL



Вопросов: 1
Ответов: 6
 Профиль | | #2 Добавлено: 03.05.06 18:00
Это файл с данными трехмерной фасетированной поверхности (состоит из треугольных граней, которых может ыть довольно много). Первое число long - количество треугольников.
Повторяющиеся записи по 50 байт:
- информация о нормали к треугольной грани (первая группа из 3-х чисел);
- координаты вершин треугольника (еще 3 группы чисел float);
- Затем разделитель (два байта, судя по образцу файла - 2 пробела).
Лучше, видимо, сначала прочитать данные в массив (для увеличения скорости), а затем разобрать.

Ответить

Номер ответа: 3
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #3
Добавлено: 04.05.06 08:26
См. топик "VС++ Загрузка массива структур", там на сях, но переделать не сложно.

P.S. Уже не первый раз натыкаюсь на термин "Бинарный файл" - народ, вам не кажется, что слово "бинарный" тут вообще никаким боком не лезет?.. Файл, он и в Африке файл - зачем его обзывать-то?
P.S.S. Это случаем не *.3DS формат?

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 04.05.06 11:46
Разбор может оказаться геморнее чем чтение (для твоего примера). Просто скажи че из этих данных тебе конкретно нужно. Если все - подумай над постом N1, все жутко просто, даже код клепать не хоцца. И вынеси все это дело в отдельную структуру, чтоб самому гемора меньше было.
См. топик "VС++ Загрузка массива структур", там на сях, но переделать не сложно.

Нахрена? Это задачка на пять строк, зачем тут С++ приплетать. Тем более что там тема совсем другая :)
Уже не первый раз натыкаюсь на термин "Бинарный файл" - народ, вам не кажется, что слово "бинарный" тут вообще никаким боком не лезет?.. Файл, он и в Африке файл - зачем его обзывать-то?

Под "Бинарным" файлом подразумевается файл открытый for Binary. Надеюсь, от Random, Input, Append и т.п. отличить смогёшь :)

Ответить

Номер ответа: 5
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #5
Добавлено: 04.05.06 13:57
Нахрена? Это задачка на пять строк, зачем тут С++ приплетать.

Зачем приплетать Си? А кто предлагал приплетать Си? Я предлагал переделать сишный код из вышеуказанного топа под VB, не более.

Тем более что там тема совсем другая

Там надо было прочитать файл со студентами, а здесь
файл с данными трехмерной фасетированной поверхности

Где тут другая тема? Те же структуры в файле. Создаёшь структуру по тем данным, что привёл автор, создаёшь массив этого типа размером под файл, читаешь файл в буфер, делаешь CopyMemory из буфера в массив и всё.

Под "Бинарным" файлом подразумевается файл открытый for Binary

Ну давайте ещё файл открытый For Binary Read называть "бинарным читательским", чтобы окончательно всё запутать.
А файл записанный For Output уже не бинарный что ли? А какой - текстовый? И открыть его For Binary Read уже нельзя?

Короче For Binary - это метод открытия файла. А бинарный файл - это двоичный файл. А поскольку сейчас все носители хранят инфу в двоичном виде, то не-двоичных файлов просто не существует.

Надеюсь, от Random, Input, Append и т.п. отличить смогёшь

Вообще нет - не смогу. К примеру, я блокнотом создал файл и хз как там его блокнот открывал. Подозреваю, что Binary, но утверждать не буду, т.к. не знаю как ещё на сях открыть файл кроме как fopen(..."r";) - что есть эквивалент Binary.

Ответить

Номер ответа: 6
Автор ответа:
 SL



Вопросов: 1
Ответов: 6
 Профиль | | #6 Добавлено: 04.05.06 14:20
Попробовал вариант N1 - прочитал комментарии и число треугольных граней. А как можно преобразовать массив байтов в число float (single в vb6)?

Dim lFileNum As Long
lFileNum = FreeFile

Open App.Path & "\" & "test_binary" For Binary As #lFileNum
ReDim byComment(0 To 79) As Byte
Get #lFileNum, , byComment

Dim strComment As String
Dim i As Integer
For i = LBound(bycomment) To UBound(bycomment)
    strComment = strComment & Chr(bycomment(i))
Next i
strComment = Trim(strComment)

Dim lFacetNum As Long
ReDim byFacetNum(0 To 3) As Byte

Get #lFileNum, 81, byFacetNum

lFacetNum = byFacetNum(0) + _
           byFacetNum(1) * 256 + _
           byFacetNum(2) * 65536 + _
           byFacetNum(3) * 16777216 ' 17030 треугольников
           '* 2 ^ 8, * 2 ^ 16, * 2 ^ 24

ReDim byFloat(0 To 3) As Byte

Get #lFileNum, 85, byFloat

Dim floatNum As Single
floatNum = byFloat(0) + _
           byFloat(1) * 256 + _
           byFloat(2) * 65536 + _
           byFloat(3) * 16777216 'overflow
           '* 2 ^ 8, * 2 ^ 16, * 2 ^ 24

Close #lFileNum

Ответить

Номер ответа: 7
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #7 Добавлено: 04.05.06 14:52
Если есть кусок памяти, например 4 байта, и ты уверен, что в этих 4-х байтах хранится float (или Single по vb-шному), то делаешь так:

dim fl as single

copymemory fl, varptr(byFloat(0)), 4


в переменной fl будет твоё число
декларацию апи-функции copymemory впишешь сам.

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 04.05.06 16:20
:) ух.... и я ворвусь :)))))
Бинари файл - который записан не open for output, а open for binary/random. Записать банарные данные (кусок памяти например) for output низя, хотя можно, но их потом нельзя будет востановить в нужный кусок памяти. А тема действительно довольна проста... Но мало относится к "VC++ Загрузка массива структур" там у меня была трабла именно с чтением МАССИВА структур, сходство лишь что там надо читать с файла и тута :) Ну ладно, попробуй и я код наваять...
Private Type FileData
    Comment         As String * 80 'заголовок (комментарии - 80 байт)
    HZ_Number       As Single      'затем число 4 байта интерпретируются как long integer
    byFacetNum(3)   As Byte        '4 группы по 3 числа ...
End Type
    
Private Sub Form_Load()
    Me.AutoRedraw = True
    Const FileName As String = "C:\myfile.dat"
    Dim fd As FileData
    
    fd.Comment = "лялляляля тут макс 80 байт"
    fd.HZ_Number = 154.684
    fd.byFacetNum(0) = 4
    fd.byFacetNum(1) = 3
    fd.byFacetNum(2) = 2
    fd.byFacetNum(3) = 1
    
    Open FileName For Binary As #1
    Put #1, , fd 'записываем
    Close #1
    
    'Типа очищаем для наглядности :)
    fd.Comment = ""
    fd.HZ_Number = 0
    fd.byFacetNum(0) = 0
    fd.byFacetNum(1) = 0
    fd.byFacetNum(2) = 0
    fd.byFacetNum(3) = 0
    
    Open FileName For Binary As #1
    Get #1, , fd 'читаем
    Close #1
    
    'Выводим то что прочитали
    Me.Print "Comment: " & fd.Comment & vbCrLf
    Me.Print "HZ_Number: " & fd.HZ_Number & vbCrLf
    Me.Print "4 записи по 3 цыфры:" & vbCrLf
    Me.Print "  1-ая:" & fd.byFacetNum(0) & vbCrLf
    Me.Print "  2-ая:" & fd.byFacetNum(1) & vbCrLf
    Me.Print "  3-ая:" & fd.byFacetNum(2) & vbCrLf
    Me.Print "  4-ая:" & fd.byFacetNum(3) & vbCrLf

End Sub


Ответить

Номер ответа: 9
Автор ответа:
 SL



Вопросов: 1
Ответов: 6
 Профиль | | #9 Добавлено: 04.05.06 16:23
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Dim floatNum As Single
CopyMemory floatNum, VarPtr(MyByte(0)), 4

получаю числа порядка 3,26268E-36 ...-39

Ответить

Номер ответа: 10
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #10 Добавлено: 04.05.06 16:31
С Neco даже спорить не буду, сразу видно что человеку пофлудить захотелось.
2Hacker

HZ_Number       As Single      'затем число 4 байта интерпретируются как long integer

Нафига число, которое нужно интерпритировать как long объявлять как Single? Ты с float попутал.
2SL

CopyMemory floatNum, VarPtr(MyByte(0)), 4

Ну если уж охота передать указатель через VarPtr, то хотя бы делай это ByVal. Иначе что получается?

Ответить

Номер ответа: 11
Автор ответа:
 SL



Вопросов: 1
Ответов: 6
 Профиль | | #11 Добавлено: 04.05.06 16:42
Спасибо! С ByVal, похоже, работает

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Any, ByVal Length As Long)
...
floatNum = -2,280134E-03 ... 135,4655

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 04.05.06 17:28
Нафига число, которое нужно интерпритировать как long объявлять как Single? Ты с float попутал


ой да! :) та то блин всё из за с++а :)) я теперь вообще с переменными путаться стал :)))

Ответить

Номер ответа: 13
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #13
Добавлено: 04.05.06 17:33
С Neco даже спорить не буду, сразу видно что человеку пофлудить захотелось.

Я лишь отвечал на твой вопрос "нахрена" - на мой взгляд оба топа - одно и то же. Там массив, здесь одно значение (что есть массив с Ubound=0) + массив, вот и сравнивай.

Единственное в чём я был не прав, так это, что тут нужен CopyMemory - всё доступно стандартными средствами (как и показывал Hacker).
Только я свой код приведу так, как я понял автора - сначала следует заголовок+число (я так думаю, кол-во полигонов), а потом сами полигоны - ряд повторяющихся групп записей по 50 байт:
Option Explicit

Private Type TriangleHeader
    comment As String * 80  ' comment = 80
    num As Long             ' num of trngls = 4
End Type


Private Type Triangle       ' multiple group of 50 bytes
    gr1(2) As Single        '
    gr2(2) As Single        ' 4 grp of 3 digit
    gr3(2) As Single        '
    gr4(2) As Single        '
    separator As Integer    ' + separator = 2
End Type

Private Sub Form_Load()
    Dim body() As Triangle
    Dim hdr As TriangleHeader
    hdr.comment = Left$("Comment", 80)
    hdr.num = 5
    ReDim body(hdr.num - 1)
    body(0).gr1(0) = 12.5
    body(hdr.num - 1).gr4(2) = 13.3
    
    Dim i As Long
    Dim nxt_pos As Long
    nxt_pos = Len(hdr)
    Open "d:\1.trngl" For Binary Access Write As #1
        Put #1, 1, hdr
        Put #1, Len(hdr) + 1, body
    Close #1
    ' ---------------------------------
    
    Dim r_hdr As TriangleHeader
    Dim r_body() As Triangle
    Open "d:\1.trngl" For Binary Access Read As #1
        If LOF(1) > Len(r_hdr) Then
            Get #1, , r_hdr
            If r_hdr.num > 0 Then
                ReDim r_body(r_hdr.num - 1)
                Get #1, Len(r_hdr) + 1, r_body
            End If
        End If
    Close #1
    Debug.Print r_hdr.comment
    If r_hdr.num > 0 Then
        Debug.Print r_body(0).gr1(0)
        Debug.Print r_body(r_hdr.num - 1).gr4(2)
    End If
End Sub

И вот он родимый МАССИВ стуктур.

Ответить

Номер ответа: 14
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #14
Добавлено: 04.05.06 18:05
Кстати, если это действительно треугольники, то такая структура будет правильнее:
Private Type Point3D
    x As Single
    y As Single
    z As Single
End Type

Private Type Triangle
    pnt1 As Point3D
    pnt2 As Point3D
    pnt3 As Point3D
    normal As Point3D
    sep As Integer
End Type


Ну дык и что это за формат? В максе можно изготовить такой файл? А где тут цвета, координаты текстур?

Ответить

Номер ответа: 15
Автор ответа:
 SL



Вопросов: 1
Ответов: 6
 Профиль | | #15 Добавлено: 04.05.06 18:39
Это бинарный вариант формата stl (самый простой выриант - ASCII - там все пишется открытым текстом, но размер в несколько раз больше). Пишут его, как минимум, системы CAD. Применяют в системах быстрого прототипирования (распечатка 3D - из пластмассы и т.п.) и для обмена 3D моделями.
Цвет и текстуры в этом формате, похоже, не поддерживаются.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам