Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Проблемка с указателями   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
15-1159800150
vidiv
2006-10-02 18:42
2006.10.22
Шашки


4-1149788245
Steplerr
2006-06-08 21:37
2006.10.22
С консолью через хендл


6-1148703221
Ezorcist
2006-05-27 08:13
2006.10.22
Передача данных одним пакетом


15-1159783231
Slider007
2006-10-02 14:00
2006.10.22
С Днем рождения ! 27 сентября


1-1158216618
AndreyAR
2006-09-14 10:50
2006.10.22
Заполнение формулы в Excel