Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Чтение бинарника (Fortran vs VB.Net) Добавлено: 11.03.11 14:53  

Автор вопроса:  Markus
Добрый день,

У меня есть бинарный файл и код для его чтения написанный на фортране.
Мне нужно сделать читалку на языке VB.net.
Пожалуйста помогите.

Вот код на фортране-


program xxx
implicit none
real*4 time
integer, parameter :: NMAX = 10000
integer istat, iBlocks, i
integer ntot, model, nrun, nk
real*4 as(30), bodys(NMAX), xs(3, NMAX), vs(3, NMAX)
character*40 sFileName
integer name(NMAX)

call GetArg(1, sFileName)
OPEN (UNIT=3,STATUS='OLD',FORM='UNFORMATTED',FILE=sFileName)
istat = 0
iBlocks = 0
do while (istat.eq.0)
      read(unit=3, iostat = istat)  ntot, model, nrun, nk
      if (istat.ne.0) cycle
      read(unit=3, iostat = istat) as(1:nk), bodys(1:ntot), &
               xs(1:3,1:ntot), vs(1:3,1:ntot),name(1:ntot)
!---->Data processing goes here
      iBlocks = iBlocks + 1
enddo
close(3)
end program xxxx





Вот что делаю я в VB.net.

...
        Dim a, b As Integer
        Dim Particle As New IO.BinaryReader(IO.File.OpenRead(Path))
        Try
            Dim ontot As Double = Particle.ReadInt16
            Dim omodel As Double = Particle.ReadInt16
            Dim onruns As Double = Particle.ReadInt16
            Dim onk As Integer = Particle.ReadInt16
            
            For a = 1 To ontot  
                For b = 1 To onruns  
                    Dim obodys As Double = Particle.ReadSingle
                    Dim oNx As Double = Particle.ReadSingle
                    Dim oNy As Double = Particle.ReadSingle
                    Dim oNz As Double = Particle.ReadSingle
                    Dim oVx As Double = Particle.ReadSingle
                    Dim oVy As Double = Particle.ReadSingle
                    Dim oVz As Double = Particle.ReadSingle
                    Dim onames As Integer = Particle.ReadInt16

           Next

        Finally
            Particle.Close()

        End Try
....



Данные читаются но в их корректном чтении я сомневаюсь, так как полученных данных должно быть больше чем получаю.
Мне кажется дело в формате данных???

Ответить

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

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



Вопросов: 1
Ответов: 5
 Профиль | | #1 Добавлено: 11.03.11 15:55
Прошу прощенья пропустил что все данные я сразу заношу в массив
  1.  
  2. ..
  3.         Dim a, b As Integer
  4.         Dim Particle As New IO.BinaryReader(IO.File.OpenRead(Path))
  5.         Try
  6.             Dim ontot As Double = Particle.ReadInt16
  7.             Dim omodel As Double = Particle.ReadInt16
  8.             Dim onruns As Double = Particle.ReadInt16
  9.             Dim onk As Integer = Particle.ReadInt16
  10.              
  11.             For a = 1 To ontot  
  12.                 For b = 1 To onruns  
  13.                     Dim obodys As Double = Particle.ReadSingle
  14.                     Dim oNx As Double = Particle.ReadSingle
  15.                     Dim oNy As Double = Particle.ReadSingle
  16.                     Dim oNz As Double = Particle.ReadSingle
  17.                     Dim oVx As Double = Particle.ReadSingle
  18.                     Dim oVy As Double = Particle.ReadSingle
  19.                     Dim oVz As Double = Particle.ReadSingle
  20.                     Dim onames As Integer = Particle.ReadInt16
  21.  
  22.                            '...
  23.                            'заношу данные в массив
  24.                            '...
  25.  
  26.  
  27.            Next
  28.  
  29.         Finally
  30.             Particle.Close()
  31.  
  32.         End Try
  33. ....
  34.  

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 11.03.11 17:15
Я думаю тут мало людей, знающих что такое фортран. Если опишешь формат бинарика, то можно будет для него код чтения придумать.

Тебе нужно поменять типы на нужные. Например, для первых 4-х считываемых переменных подойдет целочисленный тип (Short или Integer)
ReadSingle читает тип Single а не Double.
ReadInt16 - Short (он же Int16)

Ответить

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



Вопросов: 1
Ответов: 5
 Профиль | | #3 Добавлено: 11.03.11 17:43
В этом вся и сложность так как о формате бинарника можно судить только по фортрановскому коду.
Насколько я знаю фортрановский real*4 это Single в VS , а real*8 это Double.
 Short или Integer чему соответствует: ReadInt16,ReadInt32,ReadInt48?

 У меня Vb.net 2005.

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 11.03.11 19:05
Кстати, фортран современный или какой-нибудь доисторический :)

PS: 2Artyom: Это не ты случайно:
Graphical interface is exessive
? :)

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 11.03.11 22:29
  1.  
  2. С#        VB.NET      CLS              Описание
  3.  
  4. byte      Byte        System.Byte      целое, 1 байт, беззнаковое
  5. sbyte     SByte       System.SByte     целое, 1 байт, знаковое
  6.  
  7. short     Short       System.Int16     целое, 2 байта, знаковое
  8. ushort    UShort      System.UInt16    целое, 2 байта, беззнаковое
  9.  
  10. int       Integer     System.Int32     целое, 4 байта, знаковое
  11. uint      UInteger    System.UInt32    целое, 4 байта, беззнаковое
  12.  
  13. long      Long        System.Int64     целое, 8 байт, знаковое
  14. ulong     ULong       System.UInt64    целое, 8 байт, беззнаковое
  15.  
  16. float     Single      System.Single    плавающая запятая, 4 байта
  17. double    Double      System.Double    плавающая запятая, 8 байт
  18. decimal   Decimal     System.Decimal   фиксированная запятая, 16 байт
  19.  
  20. char      Char        System.Char      юникодовский символ, 2 байта
  21. bool      Boolean     System.Boolean   булевое, 1 байт

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 11.03.11 22:39
VβÐUηìt пишет:
PS: 2Artyom: Это не ты случайно:

не понял к чему это

Ответить

Номер ответа: 7
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #7
Добавлено: 11.03.11 22:44
А, забей, значит не ты :)

Ответить

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



Вопросов: 1
Ответов: 5
 Профиль | | #8 Добавлено: 13.03.11 22:19
Какая версия фортрана незнаю но этот код точно совместим с G95, gfortran.
В какой последоватльности считываются данные судя по фортрановскому коду?
Как я понял здесь используется неформатированной вывод с последовательным доступом.
 Из книге по фортрану такой тип файлов с данными состоит из записей с переменной длиной разделенной маркерами, данные хранятся в двоичном представлении. В начале и в конце записи с переменной длиной располагается служебная инофрмация - поле счетчика, 4-байтовое целове число, значений которого равно количеству байтов данных в этой записи.
 Нужно ли при чтении в VB.net учитывать эти маркеры?
Как я думаю name(1:ntot) это и есть маркер.!?

Ответить

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



Вопросов: 1
Ответов: 5
 Профиль | | #9 Добавлено: 13.03.11 22:22
В фортране по умолчанию если не определено это отдельно тип integer четырехбайтный.

Ответить

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



Вопросов: 1
Ответов: 5
 Профиль | | #10 Добавлено: 14.03.11 07:47
Спасибо проблема решена. Как оказалось в конце и в начале каждой записи стоят четырех-байтные маркеры. Что бы ничего не съехало при считывании эти маркеры надо учитывать.

Ответить

Страница: 1 |

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



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