Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: За грузка эелментов в структуру из файла Добавлено: 19.05.09 11:41  

Автор вопроса:  -=Fenix=-
Здрасте, подскажите как рнеализовать на VB/VB.NET:
имеется к примеру обыновенные ПЕ файл с байтами
4D 5A 90 00 03 00

и есть структура
Strcture Header
Dim Signature as UInt16
Dim Count_Byte As UInt16
Dim Size_File As UInt16
End Structure

как загрузить в структуру не прибегая к указанию записи для каждого элемента?

p.s. знаю вот на С будет типа
for(i = 0; i < sizeof(EXE_HDR); i++)
{
  *(((char*)exeh) + i) = fgetc(exe_file);
  if(feof(exe_file)) break;
}

Ответить

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

Номер ответа: 1
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #1
Добавлено: 19.05.09 12:21
CopyMemory?

Ответить

Номер ответа: 2
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #2 Добавлено: 19.05.09 12:25
А можно примерчик? А то чё-то мои мысли кончились сериализацией, которая неподошла

Ответить

Номер ответа: 3
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #3 Добавлено: 19.05.09 22:48
Проблему решил, топик можно закрыть!

Решение :
  1. Imports System.Runtime.InteropServices
  2.  
  3. Dim Struct as MyStruct
  4. Dim FS As System.IO.FileStream
  5. Dim BR As System.IO.BinaryReader
  6.  
  7. FS = New System.IO.FileStream(File, IO.FileMode.Open)
  8. BR = New System.IO.BinaryReader(FS)
  9. BR.BaseStream.Seek(0, IO.SeekOrigin.Begin)
  10.  
  11. Struct = ToStructure(BR.ReadBytes(Marshal.SizeOf(Struct), Struct.GetType)
  12.  
  13. Private Function ToStructure(ByVal Value() As Byte, ByVal Type As System.Type)
  14.     Dim MyGC As GCHandle = GCHandle.Alloc(Value, GCHandleType.Pinned)
  15.     Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, Type)
  16.     MyGC.Free()
  17.  
  18.     Return Obj
  19. End Function

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 20.05.09 16:24
  1.     Public Shared Function ToArray(Of T)(ByVal data As T) As Byte()
  2.         Dim Size = Marshal.SizeOf(data)
  3.         Dim Buff(Size - 1) As Byte
  4.  
  5.         Dim Handle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
  6.         Marshal.StructureToPtr(data, Handle.AddrOfPinnedObject, False)
  7.         Handle.Free()
  8.  
  9.         Return Buff
  10.     End Function
  11.  
  12.     Public Shared Function ToStructure(Of T As New)(ByVal data As Byte()) As T
  13.         If Marshal.SizeOf(GetType(T)) <> data.Length Then
  14.             Throw New Exception("Size mismatch")
  15.         End If
  16.  
  17.         Dim Result = New T
  18.         Dim Handle = GCHandle.Alloc(data, GCHandleType.Pinned)
  19.         Marshal.PtrToStructure(Handle.AddrOfPinnedObject, Result)
  20.         Handle.Free()
  21.  
  22.         Return Result
  23.     End Function

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 20.05.09 21:33
К сожалению, функция VB6 LSet затерялась в небытии. Потому в доте приходится решать эту задачу через пятую точку.
К великой радости фундаментальных поклонников ежедневного рефакторинга.

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 20.05.09 22:37
О, я еще помню гениальные кейворды для работы с сериализованными данными. DATA, READ и RESTORE.

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 20.05.09 22:38
Забудь, в дотнете их тоже порезали

(* пошел рефакторить код *)

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 20.05.09 22:42
Сволочи!

// ушел рефакторить код

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 20.05.09 22:47
LSet убили! Галактего ф опасносте!!

/* ушел рефакторить код */

Ответить

Номер ответа: 10
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #10
Добавлено: 20.05.09 23:07
омфг

;ушел рефакторить код

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #11 Добавлено: 20.05.09 23:22
Вы всё еще рафакторите?
Тогда мы идем... хотя - да хрен ли у вас делать :D

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 20.05.09 23:41
Совершенно нечего.

' Ушел рефакторить код

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #13 Добавлено: 20.05.09 23:45
Ушел рефакторить код

Ты все еще здесь?
Получаешь -1 за уклонение от рефакторинга.

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #14 Добавлено: 20.05.09 23:48
И встать! Когда с тобой разговаривает подпорутчик! :)

Ответить

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



Вопросов: 60
Ответов: 808
 Профиль | | #15 Добавлено: 20.05.09 23:56
Люби LSet, сука! (c) УПЧК стайл

Все любят LSet... (с) Футурама стайл

Ответить

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

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



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