Бинарный доступ к файлам

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

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

Vladlex
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 12.02.2008 (Вт) 16:01
Откуда: Владивосток

Бинарный доступ к файлам

Сообщение Vladlex » 18.01.2010 (Пн) 16:05

Как получить значения типа integer из массива типа byte?
т.е я с помощью ReadAllBytes считываю бинарник в массив Bytes()
К примеру, я знаю, что первые тридцать два бита - это число типа single.
Вот каким образом его вытащить?
Дико извиняюсь, я вообще с бинарниками не работал.
Человек - дитя препятствий. Блан де Сент-Бонне.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Бинарный доступ к файлам

Сообщение MIT » 18.01.2010 (Пн) 16:38

Есть два способа: использовать MemoryStream (проще, но дольше) или использовать неуправляемую память (быстрее, но сложнее). Тебе про какой рассказать?
Есть еще вариант с битовыми сдвигами, но это просто, не интересно (хотя и очень производительно), и я надеюсь, что ты о нем знаешь.
Да, еще можно сразу читать в переменные нужного типа...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Vladlex
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 12.02.2008 (Вт) 16:01
Откуда: Владивосток

Re: Бинарный доступ к файлам

Сообщение Vladlex » 18.01.2010 (Пн) 16:44

Мне самое простое и быстрое. То есть, если я правильно понял, вариант с битовыми сдвигами ))

Потому как я сам занимаюсь сейчас полной ахинеей - складываю байты (for i = 0 to 3) получая сумму элементов от bites(0) до bites(3) и выводя их как single. Естественно, получается ахинея (128). То есть, я вообще не представляю, в какую сторону мне двигать. Может, я вообще неправильную переменную завел? может там bytes() as byte вообще не нужен, а там как-то по-другому надо... В общем, я в растерянности.

А как можно сразу читать в переменные нужного типа?!
Человек - дитя препятствий. Блан де Сент-Бонне.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Бинарный доступ к файлам

Сообщение MIT » 18.01.2010 (Пн) 16:53

Ну что-то типа так:
Код: Выделить всё
Dim b() As Byte = New Byte() {&H11, &H22, &H33, &H44}
Dim s As Single = (b(0) And &HFFFFFFFF) << 24 Or (b(1) And &HFFFFFF) << 16 Or (b(2) And &HFFFF) << 8 Or b(3)
Это на вскидку, по идее привильно.

Добавлено:
Проверил - для чисел с плавающей точкой указанный выше способ не подходит. Точно работает вот так:
Код: Выделить всё
Dim b() As Byte = New Byte() {&H11, &H22, &H33, &H44}
Dim s As Single = BitConverter.ToSingle(b, 0)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

Re: Бинарный доступ к файлам

Сообщение Viper » 18.01.2010 (Пн) 19:08

Vladlex писал(а):Как получить значения типа integer из массива типа byte?
т.е я с помощью ReadAllBytes считываю бинарник в массив Bytes()
К примеру, я знаю, что первые тридцать два бита - это число типа single.
Вот каким образом его вытащить?
Дико извиняюсь, я вообще с бинарниками не работал.
А собственно изначальная задача то какая? А то сдается мне производится попытка решить X через Y. Про работу с памятью в VB.NET стоит почитать мою статью на основном форуме.
Весь мир матрица, а мы в нем потоки байтов!

Vladlex
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 12.02.2008 (Вт) 16:01
Откуда: Владивосток

Re: Бинарный доступ к файлам

Сообщение Vladlex » 19.01.2010 (Вт) 2:40

MIT, спасибо огромное. Именно это и надо было! На всякий случай сверил получающиеся данные с теми, что должны быть - совпадают. Все работает!

Viper, ну не знаю Х через Y или нет. Изначальная задача - прочитать бинарный файл, вытащить из него заголовок (формата single,single, ushort, char(30),char(30), single, single, ushort, char(40)) и с помощью него после этого рассовать по массиву дальнейшие данные. Я пока с заголовком разбирался, но с массивами проблем не возникнет. Мне главное было - из байт в integer, single и подобные преобразовать. До вашей статьи я доберусь, думаю. Потому как рано или поздно придется с памятью работать даже такому быдлокодеру как я =)

Еще раз всем спасибо.
Человек - дитя препятствий. Блан де Сент-Бонне.


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

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

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

    TopList