запись в двоичный файл «побайтно»

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

запись в двоичный файл «побайтно»

Сообщение SunnyVa » 17.05.2006 (Ср) 8:28

Помогите, пожалуйста, я никак не могу понять, как мне правильно реализовать запись в двоичный файл «побайтно»:
Если я правильно понимаю, то я для начала открываю файл, указывая тип Binary
Код: Выделить всё

Dim iFr As Short
iFr = FreeFile()
FileOpen(iFr, "C:\test.txt", OpenMode.Binary)



Затем, по идеи, я должна произвести запись в открытый файл (при этом указывая адрес, куда то или иное значение будет записано), но вот, к сожалению, не понимаю, как это верно сделать

Код: Выделить всё

FilePut(iFr, k, Позиция)


Переменная k должна быть типа Byte??? (Сами данные у меня хранятся в строке (длина её 8 – т.е. как раз если правильно перевести, то должно получиться значение 1 бита) в виде нулей и единиц – надо ещё их перевести)

Объясните, пожалуйста…

Мне необходимо понять, как реализовать запись, где в нужную позицию в файле я должна записать то или иное значение (в сам файл буду записывать параметры 4-х генераторов, для записи всех параметров 1-го из генераторов необходимо 40 позиций (у каждого генератора 40 параметров)):
Если я верно понимаю, то структура файла получается такая
0
.
. Параметры 1-го генератора
.
64
.
. Параметры 2-го генератора
.
128
.
. Параметры 3-го генератора
.
192
.
. Параметры 4-го генератора
.
256

Т.е. общая формула вычисления позиции в файле, в которую необходимо записать значение получается такое: Позиция=0+40*(НомерГенератора-1)+(НомерПараметра)
Если запись начинается с 1, то по идеи ещё в конце прибавить единичку нужно…

Как мне это реализовать, подскажите новичку? (Прошу прощение, если все-таки я не совсем доступно объяснила, что мне необходимо)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.05.2006 (Ср) 8:42

Функция FilePut является перегруженной и вполне может заисывать строки. Так что строки ты вполне можешь записать.

З.Ы. Функция FreeFile возвращает значение типа Integer а не Short. Это так, для сведения.
Весь мир матрица, а мы в нем потоки байтов!

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 17.05.2006 (Ср) 9:43

!Viper!, т.е. я могу свободно записывать в указанною мною позицию значение бита в виде строки из нулей и единиц я тебя правильно поняла... но ведь это не верно... Если я записываю в файл строку, то он на это в файле отведет 2 байта... так? а я хочу в указанную позицию записать 1 байт...

С FreeFile поняла - исправлю - спасибо огромное!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.05.2006 (Ср) 9:49

При чем тут биты то вообще?... Меньше байта всяко не запишешь... :D

Если функции передать в качестве аргумента строку, то она и запишет начиная с указанной позиции все байты из которых состоит строка, т.е. код

Код: Выделить всё
FilePut iFr, "Просто строка",1


запишет 26 байтов (из которых состоит данная строка), начиная с позиции 1.
Весь мир матрица, а мы в нем потоки байтов!

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 17.05.2006 (Ср) 10:04

Т.е. если я запишу
Код: Выделить всё
FilePut iFr, "10000001",1

то что запишется в файл???
Не понимаю я, объясни плиз :(

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.05.2006 (Ср) 10:13

как что? 16 байтов из которых состоит строка "10000001"
Весь мир матрица, а мы в нем потоки байтов!

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 17.05.2006 (Ср) 10:24

эх... не то :(
как бы тебе объяснить...
мне нужна вот такая запись в файл: адрес в файле+данные
адрес в файле=базовый адрес + адрес параметра генератора
данные=1 байт

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.05.2006 (Ср) 20:18

SunnyVa
Открой калькулятор, переведи в инженерный вид, включи бинарный режим, напиши в нем 10000001. Теперь включи шестнадцатиричный режим (hex) и твое число превратится в байт - 81. Вот этот байт и нужно записывать.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.05.2006 (Ср) 20:22

Но, если ты напишешь
Код: Выделить всё
FilePut iFr, "81",1

То получишь два байта представляющие цифры "8" и "1". Поэтому тебе надо записывать именно байт, а не строку. Как это сделать, сходу не припомню, поспрашивай остальных участников.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 18.05.2006 (Чт) 7:15

вообщем не хочу юзать System.IO.FileStream поэтому решила сделать так:
1. брать строчку, где храниться битовая инфа
2. её передавать в функцию, которая будет уже возвращать значение типа Byte
3. После чего делать запись в файл так FilePut iFr, b, 1
где b у меня тип Byte и впервую позицию он мне как раз запишет значение в нужном мне формате...


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList