![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемка с указателями
_Mouse_ © (2006-09-14 12:56:00)Уважаемый мастера, что-то я запутался с указателями. Помогите разобраться.
Есть у меня массив (цепочка) байт:
type TArray = array[0..159999] of byte; PArray = ^TArray;
И сами переменные с которыми работаю:
PObj : PArray;
MW : WORD;
MDW : DWORD;
Допустим PObj содержит следующую цепочку чисел:
26 0 14 118 103 216 105 .... и тд.
0-й байт я пропускаю.
Мне надо в MW (2-х байтовое число) получить 014 (1 и 2-й байт в цепочке) и в MDW (4-х байтовое число) получить 1986517097 (3-6 байты в цепочке).
Делаю так: (Для этого ввел еще 2 переменных: pMW :PWORD и pMDW : PDWORD)
pMW := PWORD(@PObj^[1]);
MW := pMW^;
pMDW := PDWORD(@PObj^[3]);
MDW := pMDW^;
В итоге получаются совсем другие числа. Кто может подсказать что не так?
Anatoly Podgoretsky (2006-09-14 20:38:00) [1]Нету ни какого начали и конца, есть порядок байт, в относительных адресах.
А начало и конец - это религиозные соображения адептов той или другой системы. Если мыслить в порядке возрастания адресов, то у Интела естественный, а у IBM противоестественный, но так у IBM было и два нуля, +0 и -0, а может еще и есть. Но это внутреннее дело IBM и связано с ранним развитием компьютерной науки, Интел пришел позже и учел данные ошибки, создав удобный процессор и систему.
_Mouse_ (2006-09-14 15:50:00) [2]ясненько ... всем спасибо.
han_malign (2006-09-14 13:42:00) [3]
> Получается что числа в Делфи идут с конца в начала.
- а числа(в Делфи, и в любых других приложениях работающих на процессорах с Little-endian организацией памяти) - как раз, идут "с начала в конец"- младшийбайт - 0-й, старший- последний...
http://www.cs.umass.edu/~verts/cs32/endian.html
Slym(RO) (2006-09-14 13:34:00) [4]ReverseString
Elen (2006-09-14 13:33:00) [5]
> _Mouse_
А ты старший ставь в обратном порядке
han_malign (2006-09-14 13:31:00) [6]
> Получается что числа в Делфи идут с конца в начала. Т.е старший байт - последний. А у меня в цепочке - старший байт - первый.
- классический Network Order(aka Big-endian) - надо переставлять байты руками для получения - принятого у Intel- Litle-endian:
Winsock2 - ntohs, ntohl
или таки MDW:= PObj[i] shl 24 or PObj[i+1] shl 16 or PObj[i+2] shl 8 or PObj[i+3];
А Delphi здесь не причем...
Slym(RO) (2006-09-14 13:28:00) [7]Обратная запись байтов...
надо не 014, а 140
Reindeer Moss Eater (2006-09-14 13:27:00) [8]Заведи переменную PByte
делай Inc(pb) для перебора элементов
В нужном месте присваивай PWORD PDWORD значение pb
И используй ^ для доступа к значениям (если в массиве половинки в нужном порядке)
_Mouse_ (2006-09-14 13:25:00) [9]Получается что числа в Делфи идут с конца в начала. Т.е старший байт - последний. А у меня в цепочке - старший байт - первый.
Как проще переконвертировать в нужный мне формат?
Elen (2006-09-14 13:10:00) [10]p.s. и не забывай перед этой операцией обнулять pMW и pMDW...
Elen (2006-09-14 13:05:00) [11]
> _Mouse_
попробуй move(pobj[1],pmw,2); и move(pobj[3],pmdw,4).