Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
1

Word разложить на два Byte

06.03.2012, 13:55. Показов 11387. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ВСТУПЛЕНИЕ:

структура заголовка BMP-файла
Delphi
1
2
3
4
5
6
7
tagBITMAPFILEHEADER = packed record
    bfType: Word;
    bfSize: DWORD;
    bfReserved1: Word;
    bfReserved2: Word;
    bfOffBits: DWORD;
  end;
первые два байта файла должны быть BM, что идентифицирует файл как BMP. Когда читаю заголовок файла в эту структуру, bfType = 19778. Если прочитать файл побайтно, первые два байта равны
66 (B)
77 (M)

А ТЕПЕРЬ ВОПРОС:
как из значения 19778 добыть значения 66 и 77? я че-то в тупике оказался.

это не помогло:
HIWORD(19778) = 0
LOWORD(19778) = 19778
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2012, 13:55
Ответы с готовыми решениями:

Как double word поделить на byte (dword/byte) ?
Здравствуйте. Помогите пожалуйста, как dword/byte. Вот пример как я делал, не понимаю в чем...

Умножение Byte на Word и Word на Byte
Есть ли какая-то разница при умножении 1) Байта на Ворд 2) Ворда на Байт ???? во втором...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

Деление Double Word на Byte
Делит с ошибкой, в чем проблема? A4 / (-A3); A4 = 17F05138h; A3 = 85h. mov al, A3 neg al...

9
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 14:00 2
Цитата Сообщение от DenNik Посмотреть сообщение
это не помогло: HIWORD(19778) = 0 LOWORD(19778) = 19778
HIBYTE, LOBYTE?

Вот тут буржуины обсуждали.
1
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.03.2012, 14:09  [ТС] 3
Цитата Сообщение от Sophos Посмотреть сообщение
HIBYTE, LOBYTE?

Вот тут буржуины обсуждали.
теперь дошло.
HIWORD,LOWORD извлекает значения WORD из четырехбайтного числа (DWORD),
а HIBYTE,LOBYTE извлекает значения BYTE из двухбайтного числа (WORD).
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.03.2012, 14:14  [ТС] 4
вот еще такое дело. Прочитал, что числа в BMP в формате Big Endian, т.е. байты поменяны местами. но почему побайтное чтение первого и второго байтов дает 66 и 77, а конвертация
HIBYTE(19778) = 77
LOBYTE(19778) = 66

ведь, как я понимаю, Hi стоит как бы слева, а Lo - справа. Или неправильно?
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 14:23 5
Цитата Сообщение от DenNik Посмотреть сообщение
Hi стоит как бы слева, а Lo - справа.
Цитата Сообщение от DenNik Посмотреть сообщение
т.е. байты поменяны местами.
.....
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.03.2012, 15:08  [ТС] 6
это я понял. вопрос в другом. физически первый байт файла равен 66, второй - 77. Но когда читаешь два байта сразу в переменную типа WORD, они оказываются поменяны местами. почему так происходит. дело в самой сущности типа WORD или в чем?
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
06.03.2012, 15:47 7
Не задумывайтесь об этом сейчас. Винда/Дельфа преподносит очень много таких маленьких сюрпризов. Например не дает передавать Nil в АПИшную функу и пр. Просто учитывайте, что ваш WORD должен быть 19778:
Delphi
1
BMP_FILE_MARK = $4D42;
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.03.2012, 15:58 8
Цитата Сообщение от DenNik Посмотреть сообщение
физически первый байт файла равен 66, второй - 77. Но когда читаешь два байта сразу в переменную типа WORD, они оказываются поменяны местами.
Вовсе нет. В памяти компьютера числа хранятся так - в младших адресах расположены младшие байты, в старших - старшие. Т. е., это расположение обратное тому, как мы привыкли записывать на бумаге. Поэтому, если в файле в первом байте (тот что "слева") записано 66, а в следующем справа - 77, то именно в таком порядке они и запишутся в память в переменную типа Word. - Т. е., в байте с меньшим адресом окажется число 66, а в байте с большим адресом окажется 77.
Функция HiByte() возвращает значение старшего байта - т. е., того, который расположен справа - это значение будет 77. А функция LoByte() возвращает значение младшего байта - т. е. того, который расположен слева - это значение будет 66.
Именно так всё и происходит в описанном выше случае.
3
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.03.2012, 18:01  [ТС] 9
Цитата Сообщение от Mawrat Посмотреть сообщение
Функция HiByte() возвращает значение старшего байта - т. е., того, который расположен справа - это значение будет 77. А функция LoByte() возвращает значение младшего байта - т. е. того, который расположен слева - это значение будет 66.
вот в чем фишка. я-то думал, что старший байт расположен слева!
0
Заблокирован
09.03.2012, 10:51 10
А вообще, чтобы разложить числа по байтам, а это нужно, к примеру, при извлечении из пиксела значений цвета... Используют ассемблер
Тут я ещё использовал метки для отображения результа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.SpeedButton1Click(Sender: TObject);
 var
 D1,D2:Byte;
 D3:word;
 begin
 D3:= $4D42;
 asm
 mov ax, D3
 mov D1, al
 mov D2, ah
 end;
 Label1.Caption:= inttostr(D1);
 Label2.Caption:= inttostr(D2);
 end;
1
09.03.2012, 10:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2012, 10:51
Помогаю со студенческими работами здесь

Type record и различные типы Byte Word DWORD
Здравствуйте форумчане, любители и профи кодить в делфи. Помогите понять суть проблемы и пути ее...

Сложить два массива byte в один
как их сложить в один массив?

Преобразовать два byte числа в одно short
Поскольку short занимает 2 байта, а byte 1 байт, значит, можно (а мне еще и нужно) записать два...

Разложить многочлен на два квадратных трехчлена
Сам многочлен: x^4+6x^3-27x+8 не получается никак ;(


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru