[CDR X5-X8] Помогите 16-ричный файл втянуть в массив

Статус
Закрыто для дальнейших ответов.

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
Всем добрый день!
В продолжении моих мучений (Тема: "Определить цвет" от 9 января) прошу вас о помощи !!!

Из вариантов предложенных _MBK_ Выбрал вариант 2 - экспортировать в файл и читать с него значение напрямую

Но естественно у меня возникли проблемы
Формат экспорта - БМП (16-ричный код)
Но как его засунуть в 10-ричный массив для дальнейшей обработки ????????
все чего я добился
Код:
Open "H:\Temp for BMP\File4.bmp" For Input As #1
    Dim s As String
    While Not EOF(1)
        Input #1, s
        MsgBox Val(s)
    Wend
Close #1
Я понимаю что это тупо и не правильно т.к. на выходе у меня "НОЛЬ", но это все что мне удалось ((((

ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПОМОГИТЕ !!!!!!!
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Это действительно тупо. Кто ж из бинарного файла String читает?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Надо делать примерно так. Открываем файл:
Код:
Open TempFile For Binary Access Read Write As #1 Len = 1
считываем байт по смещению ofs
Код:
Dim Bt As Byte
Get #1, ofs, Bt
пишем байт по смещению ofs
Код:
Dim Bt As Byte
Put #1, ofs, Bt
закрываем файл
Код:
Close #1
 
  • Спасибо
Реакции: Erchizo

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 891
Реакции
3 458
Ссылка на тему в тему не ведёт.
 

splxgf

12 лет на форуме
Сообщения
7 744
Реакции
3 425
  • Спасибо
Реакции: Erchizo

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
По совету splxgf нашел следующий код:

Код:
Type BITMAPFILE
     bmfh As BITMAPFILEHEADER
     bmih As BITMAPINFOHEADER
     aBitmapBits() As BGR  'Содержат 3-байтовые элементы
End Type

Type BITMAPFILEHEADER '14 байт
     bfType As Integer
     bfSize As Long
     bfReserved1 As Integer
     bfReserved2 As Integer
     bfOffBits As Long
End Type

Type BITMAPINFOHEADER '40 байт
     biSize As Long
     biWidth As Long
     biHeight As Long
      iplanes As Integer
     biBitCount As Integer
     biCompression As Long
     biSizeImage As Long
     biXPelsPerMeter As Long
     biYPelsPerMeter As Long
     biClrUsed As Long
     biClrImportant As Long
End Type

Type BGR '3 байта / 1 вариант
     rgbBlue As Byte
     rgbGreen As Byte
     rgbRed As Byte
End Type 'Обратите внимание, что поля всегда имеют синий цвет -> зеленый -> красный

Dim bitmap1 As BITMAPFILE
Dim headers As Integer
Dim hei, wid, kx, ky As Long

Sub Init()
     Open strVarPath For Binary As #1
End Sub

Sub Read_header()
     Get #1, , bitmap1.bmfh
     Get #1, , bitmap1.bmih
     headers = LOF(1) - bitmap1.bmih.biSizeImage 'Размер части от начала до данных
End Sub

Sub Next_init()
Dim i, j As Long
Dim bitmp As String
     hei = bitmap1.bmih.biHeight
     wid = bitmap1.bmih.biWidth
     '--------------- Получить высоту и ширину
     kx = wid
     ky = hei
     '--------------- Сделать ширину ровной
     If (kx Mod 2 <> 0) Then
          kx = kx + 1
     End If
     '--------------- объявить массив, из которых размер = высота х ширина
     ReDim bitmap1.aBitmapBits(ky, kx)
     Close #1
     Init
     bitmp = Space(headers)
     Get #1, , bitmp '------ Прочитайте часть перед данными
     For i = 1 To ky
          For j = 1 To kx
               Get #1, , bitmap1.aBitmapBits(i, j) 'Здесь мы читаем данные пострчно
          Next j
     Next i
End Sub

Sub process() 
'Здесь выполняются задачи на основе полученного массива данных
End Sub

Sub Finish()
     Close #1
End Sub

Private Sub cmdWork_Click()
     Init
     Read_header
     Next_init
     process
     Finish
End Sub

Он полностью соответствует решению моей задаче, но....
Дело в том, что это все под VB 6.0, но в VBA 7.1 все это не работает (((((
Я так понимаю понятий
BITMAPFILEHEADER и BITMAPINFOHEADER
в VBA 7.1 не существует
Может можно как-то адаптировать этот код под VBA 7.1
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
BITMAPFILEHEADER и BITMAPINFOHEADER
Ну видно же что это не встроенные типы а определяются прямо в коде
Другое дело, я не уверен что в кореловском VBA можно таким образом типы самому определять вообще - это все таки не Си++ ;)
 

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
Как быть ??
Что подскажите
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Как конкретно ошибка формулируется и на какой оператор?
Если на Type BITMAPFILE то я вам сильно сочувствую и советую переписать весь код без использования типизированных записей.
А вообще говоря вы не с того конца копать начали
Вам Всеволод советовал искать примеры на VBA а вы что нашли?
 

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
как раз ругается на Type BITMAPFILE
то есть VB и VBA разные языки ?
 

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
Хорошо, вернее плохо...
Скажите, после просмотра кода:
Код:
Sub Test()
Dim Bt() As Byte

Open "H:\Temp for BMP\File2.txt" For Binary Access Read As #1 Len = 1
ofs = 1
        Get #1, ofs, Bt
Close #1

End Sub
в файле File2.txt, 8 16-ричных символов

Исходя из (подсказанного вами) кода все ли эти восемь символов записаны в массив Bt.
Просто я не могу этого увидеть.
Код:
        MsgBox Bt
выводит пустоту
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Немудрено - MsgBox выводит строку а у вас бинарный массив
Я не совсем понимаю что вы хотите MsgBoxом на экран вывести? Что считалось? Выводите код символа
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Вообще говоря, странно, что мы имеено здесь такие вещи обсуждаем
Или вас в гугле забанили? Сейчас глянул - полно ссылок с примерами как на VBA читать бинарный файл 'rtfm''google'
Вот например первая сверху
 
  • Спасибо
Реакции: Erchizo

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
Изначально мне нужно данные из витмап-файла (16-ричный код) загнать в массив (10-ричный).
Под словом данные мне нужны только - цветовые данные
То есть если в bmp-файле
... FF FF FF FA F6 F3 EF EE ED ...
То в массиве это должно выглядеть как
... 255, 255, 255, 254, 250, 246, 243, 239, 238, 237, ...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
данные из витмап-файла (16-ричный код) загнать в массив (10-ричный).
Вы не совсем правильно представляете себе процесс
То что вы называете "10чными и 16ричными данными" на самом деле - пустой звук.
Ибо это лишь человеческая интерпретация чисел - можно одно и то же число назвать по разному в зависимости от системы исчисления.
От непоняток в терминах у вас путаница в голове и изза этого вы не можете осознать примеры которых полно везде
Есть два типа файлов - бинарные (EXE, BMP, TIFF, CDR тысячи их!) и текстовые
Соответственно, они отличаются способом чтения-записи и интерпретации результатов
Если из текстовых можно читать последовательно текстовые строки (String) и выводить их на экран через MsgBox
То из бинарных - байты, слова или двойные слова
Или массивы байтов, слов, двойных слов, типизированных записей, как в вашем примере и т д
Как только вы забудете про системы счисления и осознаете этот факт - все в вашей голове станет на свои места
 

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 891
Реакции
3 458
Статус
Закрыто для дальнейших ответов.