Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизПроблемка с указателями Найти похожие ветки
← →
_Mouse_ (2006-09-14 12:56) [0]Уважаемый мастера, что-то я запутался с указателями. Помогите разобраться.
Есть у меня массив (цепочка) байт:
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^;
В итоге получаются совсем другие числа. Кто может подсказать что не так?
← →
Elen © (2006-09-14 13:05) [1]
> _Mouse_
попробуй move(pobj[1],pmw,2); и move(pobj[3],pmdw,4).
← →
Elen © (2006-09-14 13:10) [2]p.s. и не забывай перед этой операцией обнулять pMW и pMDW...
← →
_Mouse_ (2006-09-14 13:25) [3]Получается что числа в Делфи идут с конца в начала. Т.е старший байт - последний. А у меня в цепочке - старший байт - первый.
Как проще переконвертировать в нужный мне формат?
← →
Reindeer Moss Eater © (2006-09-14 13:27) [4]Заведи переменную PByte
делай Inc(pb) для перебора элементов
В нужном месте присваивай PWORD PDWORD значение pb
И используй ^ для доступа к значениям (если в массиве половинки в нужном порядке)
← →
Slym(RO) (2006-09-14 13:28) [5]Обратная запись байтов...
надо не 014, а 140
← →
han_malign © (2006-09-14 13:31) [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 здесь не причем...
← →
Elen © (2006-09-14 13:33) [7]
> _Mouse_
А ты старший ставь в обратном порядке
← →
Slym(RO) (2006-09-14 13:34) [8]ReverseString
← →
han_malign © (2006-09-14 13:42) [9]
> Получается что числа в Делфи идут с конца в начала.
- а числа(в Делфи, и в любых других приложениях работающих на процессорах с Little-endian организацией памяти) - как раз, идут "с начала в конец" - младший байт - 0-й, старший - последний...
http://www.cs.umass.edu/~verts/cs32/endian.html
← →
_Mouse_ (2006-09-14 15:50) [10]ясненько ... всем спасибо.
← →
Anatoly Podgoretsky © (2006-09-14 20:38) [11]Нету ни какого начали и конца, есть порядок байт, в относительных адресах.
А начало и конец - это религиозные соображения адептов той или другой системы. Если мыслить в порядке возрастания адресов, то у Интела естественный, а у IBM противоестественный, но так у IBM было и два нуля, +0 и -0, а может еще и есть. Но это внутреннее дело IBM и связано с ранним развитием компьютерной науки, Интел пришел позже и учел данные ошибки, создав удобный процессор и систему.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.123 c