Разбиение машинного слова на байты

Предыдущая тема Следующая тема Перейти вниз

Разбиение машинного слова на байты

Сообщение  Eric-S в Вт Дек 30, 2008 7:46 pm

Такая задачка. Нужно разбить uinteger переменную на 4 отдельных байта.

Кажеться есть функции, взять какой-то байт слова?
Но насколько они платформанезависимые? Очень мне не хочеться, чтобы первый байт оказался вторым и наоборот.


На асме она конечно решаеться легко, с некоторыми оговорками, но всё же хочеться средствами freebasic'a

Впрочем есть и другое математическое решение, которое имхо, тормознутое. Но зато без всяких оговорок.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  tux в Ср Дек 31, 2008 11:16 am

я знаю "не тормознутых" 2 варианта:
1) использовать union
2) использовать указатели, те к примеру так
Код:

dim as pWord as uinteger, pByte(3) as ubyte, pPtr as any ptr, i as integer
pWord=&H12345678
pPtr=@pWord
for i=0 to 3
  pByte(i)=*(pPtr+i)
next i
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Gena в Ср Дек 31, 2008 7:06 pm

Код:

#Define RGBA_R( c ) ( CUInt( c ) Shr 16 And 255 ) 'Preobrazovanie chisla v RGBA
#Define RGBA_G( c ) ( CUInt( c ) Shr  8 And 255 )
#Define RGBA_B( c ) ( CUInt( c )        And 255  )
#Define RGBA_A( c ) ( CUInt( c ) Shr 24            )
- это для перевода цвета в формат RGBA - думаю подойдёт и для вашего случая.
santa

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  tux в Чт Янв 01, 2009 12:02 am

тоже кстать вариант... забыл про него
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Чт Янв 01, 2009 11:31 pm

Спасибо! Не совсем то. Я например так и не понял для чего нужно было юзать cubyte и and.

Но зато, пытаясь разобраться с вашим кодом, я сделал это. и это выглядит очень удобно. Я подозреваю, что и работать будет гораздо быстрее.

Код:

dim c(1 to 4) as ubyte
dim as uinteger a, b
do

locate 25, 1, 0: print "press ctrl+c to break";
locate 21, 1, 0: input "enter number: ", a
cls
 print "a = "; a

c(4) = a
c(3) = a shr 8
c(2) = a shr 16
c(1) = a shr 24

print "c = "; c(1); " "; c(2); " "; c(3); " "; c(4)

b = c(4) + (c(3) shl 8) + (c(2) shl 16) + (c(1) shl 24)
print "b = "; b
loop

А теперь ещё вопрос на засыпку. Вот я пишу
Код:

c(4) = a
Но тут у меня данные разных типов. Но ведь работает!

Например вбиваю 65535
И вижу разбор
0 0 255 255
Оригинально!
Этот эфект нормален или следует чего-то с ним ещё сотворить?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Чт Янв 01, 2009 11:40 pm

Здорово!
Вставил в код и всё стало совсем круто.
Даже вылечилась ошибка.
Хе-хе. Вот тебе и математика, блин!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  tux в Чт Янв 01, 2009 11:44 pm

Код:

c(4) = a
c(3) = a shr 8
c(2) = a shr 16
c(1) = a shr 24
несовсем правильно,Ю помоему компилятор должен выдавать предупреждение о несоответствии типов, желательно делать так
Код:

c(4) =cubyte(a)
c(3) =cubyte(a shr 8)
c(2) =cubyte(a shr 16)
c(1) =cubyte(a shr 24)
а вот если бы надо было значение байта сохранить в переменной, размерностью более одного байта, то обязательно нужно отбросить лишнее, замаскировав через and:
Код:

c(4) =cubyte(a and &000000FF)
c(3) =cubyte((a and &0000FF00) shr 8)
c(2) =cubyte((a and &00FF0000) shr 16)
c(1) =cubyte((a and &FF000000) shr 24)
однако в данном случае необязательно, тк лишнее отбросит компилятор
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  ExMortis в Чт Янв 01, 2009 11:56 pm

Код:

dim shared as integer c
dim shared as integer a

*cast(ubyte ptr, c + 0) = *cast(ubyte ptr, a + 0)
*cast(ubyte ptr, c + 1) = *cast(ubyte ptr, a + 1)
*cast(ubyte ptr, c + 2) = *cast(ubyte ptr, a + 2)
*cast(ubyte ptr, c + 3) = *cast(ubyte ptr, a + 3)
'' то же самое, что c = a

*cast(ubyte ptr, c + 0) = &hff
*cast(ubyte ptr, c + 1) = &hff
*cast(ubyte ptr, c + 2) = 0
*cast(ubyte ptr, c + 3) = 0

'' c = 65535
avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Пт Янв 02, 2009 12:27 am

Угу. Понятно. По сути разобрали ручками.
Я в логику уже врубился. Да и теорию знаю.
Просто пока на практике не помучаешься, с проблемой, не поймёшь как её решать.

Я ещё хотел спросить. А это так на всех машинах?
Просто я чо-то такое слышал, что на разных платформах, хранение данных в памяти различно.
Да и в процессоре, всё шиворот на выворот.
Сначало второй байт, а потом первый.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  ExMortis в Пт Янв 02, 2009 12:52 am

avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Пт Янв 02, 2009 1:48 am

Короче делаю вывод, что лично я могу не париться.
Поскольку shr и shl рулят не совсем напрямую с памятью.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Пт Янв 02, 2009 1:38 pm

Я прошу прощения. Давайте опять вернёмся к little-endian и big-endian. Оказываеться есть во freebasic соответствующая константа.

Будет ли работать мой пример с shr и shl. Особено критично, чтобы индексы массива c() были теже. Ведь оно сохраняеться в файл. Т.е. может быть перенесено на другую машину. А там выясниться, что формат не в ту сторону повёрнут.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  electrik в Пт Янв 02, 2009 2:21 pm

привет. оператор "cast" классная вещь, но в данном случае сдвиг будет работать быстрее, и вообще операции сдвига всегда быстрее.
код:
dim shared as integer c
dim shared as integer a
*cast(ubyte ptr, c + 0) = *cast(ubyte ptr, a + 0)
*cast(ubyte ptr, c + 1) = *cast(ubyte ptr, a + 1)
*cast(ubyte ptr, c + 2) = *cast(ubyte ptr, a + 2)
*cast(ubyte ptr, c + 3) = *cast(ubyte ptr, a + 3)
слишком много перебросов байт в памяти и операций сложения

теперь по поводу FB_BIGINDIAN" и т.д.
смотря на какой платформе компилим, так как под windows, FreeBasic может компилить только под dos, cywin и windows, в ранних версиях можно было компилить под linux, но в новых версиях под windows, они это убрали.
соответственно в код пишем что-то типа
если fb_bigindian
действия под ту или иную платформу.
так будет надежней, и меньше потраченых нервов.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Пт Янв 02, 2009 4:29 pm

Так в том-то всё и дело, что я не знаю, какая будет математика. Как повлияет архитектура BIGINDIAN, на мою прогу.

Можно конечно встроить тест... На тот случай если BIGINDIAN вывернет все мои числа. Или ещё лучше, просто запретить компиляцию, хе-хе!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  tux в Пт Янв 02, 2009 4:36 pm

да не, если я правильно понимаю, то предлагается юзать http://freebasic.ru/tux/wikka/KeyPgDdFBBigEndian
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Eric-S в Пт Янв 02, 2009 5:33 pm

Tux, именно. Но она же ведь только показывает для какой машины компилиться прога.

Но вот следует ли мне менять код или нет?

если
Код:

dim a as uinteger = 1
print cubyte(a),  cubyte( a shr 8 )
должна показать на ле машине
1 0

То что покажет на бе машине?
1 0

или
0 1

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  tux в Пт Янв 02, 2009 5:45 pm

ну так смысл в том, что нужно делать так:
Код:

dim a as uinteger = 1
#IFDEF __FB_BIGENDIAN__
  '...instructions only for big endian machines
  print cubyte(a),  cubyte( a shr 8 )
#ELSE
  '...instructions only for little endian machines
  print  cubyte( a shr 8 ), cubyte(a)
#ENDIF
конечно придется дважды писать похожий код, зато будет 100% гарантии что выглядеть будет всегда одинаково
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Разбиение машинного слова на байты

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения