Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемка с указателями


_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).


Наверх

Титульная страница Поиск, карта сайта Написать письмо