Поменять порядок байт в single

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

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

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Поменять порядок байт в single

Сообщение UnCen » 30.10.2009 (Пт) 7:58

При переходе с vb6 на vb.net столкнулся с проблемой чтения данных из двоичного файла со значениями типа single с противоположным порядком байт. На vb6 я перегружал все в байтовый массив, менял порядок на правильный и переносил в переменную типа single. В vb.net отсутствует команда VarPtr... Подскажите, как можно загрузить подобный файл?

Как я делал на VB6:

Код: Выделить всё
Dim Arr(1 To 5) As Byte
Dim s as single

    Get #1, offset, Arr   ' Считали значения

        BytArr(5) = BytArr(1)  ' Поменяли местами байты с 1 по 4
        BytArr(1) = BytArr(4)
        BytArr(4) = BytArr(5)
        BytArr(5) = BytArr(2)
        BytArr(2) = BytArr(3)
        BytArr(3) = BytArr(5)

    GetMem4 VarPtr(Arr(1)), VarPtr(s) ' Получили в S правильное значение

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Re: Поменять порядок байт в single

Сообщение UnCen » 30.10.2009 (Пт) 8:25

День гуглил безрезультатно, как вопрос написал - нашел решение... :)

Код: Выделить всё
        Dim a, b As Single
        Dim c(4) As Byte
        a = 1231.654741111
        c = BitConverter.GetBytes(a)
        ReDim Preserve c(4)

        c(4) = c(0)
        c(0) = c(3)
        c(3) = c(4)
        c(4) = c(1)
        c(1) = c(2)
        c(2) = c(4)

        b = BitConverter.ToSingle(c, 0)
        MessageBox.Show(b)


Остается вопрос знатокам - можно ли код сделать красивее, без кучи пересылок...

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поменять порядок байт в single

Сообщение FireFenix » 30.10.2009 (Пт) 9:35

UnCen писал(а):
Код: Выделить всё
        c(4) = c(0)
        c(0) = c(3)
        c(3) = c(4)
        c(4) = c(1)
        c(1) = c(2)
        c(2) = c(4)

можно просто
Код: Выделить всё
c.Reverse()
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Поменять порядок байт в single

Сообщение Денис » 30.10.2009 (Пт) 9:38

UnCen писал(а):День гуглил безрезультатно, как вопрос написал - нашел решение.


Тип String в .Net это класс. И у него есть методы. Вот посмотри на них, а вдруг там всё есть? ;)
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Re: Поменять порядок байт в single

Сообщение UnCen » 30.10.2009 (Пт) 9:44

Тип String в .Net это класс. И у него есть методы. Вот посмотри на них, а вдруг там всё есть? ;)

Тогда совсем некрасиво получится... сначала в стринг, потом меняем порядок, потом снова в single...

Как посоветовал FireFenix - c.Reverse()
Так получится проще и нагляднее (и быстрее, я думаю)

Код: Выделить всё
        c = BitConverter.GetBytes(a)
        с.reverse
        b = BitConverter.ToSingle(c, 0)
         

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Поменять порядок байт в single

Сообщение Mikle » 30.10.2009 (Пт) 19:16

А если Union задействовать?

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

Re: Поменять порядок байт в single

Сообщение Viper » 30.10.2009 (Пт) 19:21

Mikle писал(а):А если Union задействовать?
А чем он помежет в деле смены порядка байт?
Весь мир матрица, а мы в нем потоки байтов!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Поменять порядок байт в single

Сообщение Mikle » 30.10.2009 (Пт) 19:33

Объединить в Union один сингл с четырьмя байтами, далее понятно...

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

Re: Поменять порядок байт в single

Сообщение Viper » 31.10.2009 (Сб) 8:08

Mikle писал(а):Объединить в Union один сингл с четырьмя байтами, далее понятно...
А разворачивать то как?
Весь мир матрица, а мы в нем потоки байтов!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Поменять порядок байт в single

Сообщение Mikle » 31.10.2009 (Сб) 9:35

Union вместо BitConverter.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поменять порядок байт в single

Сообщение iGrok » 31.10.2009 (Сб) 13:28

Mikle писал(а):Union вместо BitConverter.

Не. Это понятно, что можно ручками байты поменять через юнион.
Вопрос в другом: Это будет быстрее, чем BitConverter, или удобнее? )
label:
cli
jmp label

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Поменять порядок байт в single

Сообщение Mikle » 31.10.2009 (Сб) 16:07

Думаю быстрее. Нужно проверить.


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

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

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

    TopList