Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизКак считать число типа Word или SmallInt из массива... Найти похожие ветки
← →
Balkon (2003-09-25 10:58) [0]Привествую мастера! Как считать число типа Word или SmallInt из массива типа Byte. Смысл в том, что из порта заполняется массив побайтно, а разбирать его нужно по два байта (типом Word или SmallInt).
Делаю так:
...
var
P1 : Pointer;
P2 : PWord;
WordVar: Word;
...
P1 := @ByteArray[num];
P2 := P1;
WordVar := P2^;
...
Но не работает - компилятор игнорирует строку P2 := P1; и в итоге в P2 лежит что-то произвольное. Посоветуйте правильный подход.
Заранее благодарен.
← →
Skier (2003-09-25 11:01) [1]Move(...) хорошая веСЧь
← →
Verg (2003-09-25 11:04) [2]WordVar:=PWORD(@ByteArray[num])^;
Не проходит что ли?
> компилятор игнорирует строку P2 := P1;
Не, че-то не верится.
← →
panov (2003-09-25 11:04) [3]
p1: Pointer;
w: Word;
NumByte: Integer; //смещение
begin
p1 := @ByteArray[0];
NumByte := 10;
p1 := Pointer(Integer(p1)+(NumByte-1)*2);
move(p1^,w,2);
← →
SergeyX (2003-09-25 11:06) [4]Всмысле игнорирует?
Конечно в вашем коде не хватает New(p2) )))).
А считать наверное можно так:
Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1));
Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2)));
← →
SergeyX (2003-09-25 11:07) [5]Т.е. так:
Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1)^);
Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2))^);
← →
Verg (2003-09-25 11:21) [6]
> SergeyX (25.09.03 11:07) [5]
> Т.е. так:
> Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1)^);
> Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2))^);
Ты это серъезно? :)
← →
panov (2003-09-25 11:24) [7]>SergeyX (25.09.03 11:07) [5]
Ты бы попробовал у себя выполнить(да даже скомпилировать) для начала.
← →
PVOzerski (2003-09-25 11:31) [8]ByteArray как описан?
← →
Palladin (2003-09-25 11:45) [9]var
P1 : Pointer;
P2 : PWord absolute p1;
← →
Balkov (2003-09-25 12:37) [10]Уважаемые!
Следующий вариант выдает WordVar = 513, хотя
хочется вообще говоря получить WordVar = 258. И это получается
если ...ByteArray[1] := 2; ByteArray[2] := 1;..., т.е. "присутствует обратный порядок байт". Как быть? (Прочие рекомендации давали совсем невразумительные результаты)
var
ByteArray: array[1..10] of Byte;
WordVar: Word;
begin
ByteArray[1] := 1;
ByteArray[2] := 2;
WordVar := PWord(@ByteArray[1])^;
← →
panov (2003-09-25 13:19) [11]Так массив у тебя в неправильном порядке заполняется...
Если это необходимо, то переставляй байты.
← →
Balkon (2003-09-25 13:21) [12]Точно таже история при считывании SmallInt. Возможен конечно такой вариант, как переприсвоение массива в обратном порядке попарно. :). Тогда считать будет возможно.
Если у кого нибудь есть "более изящные" варианты, может поделитесь.
В любом случае Всем спасибо!
← →
ZrenBy (2003-09-25 13:22) [13]var B : array[1..10] of byte;
W : WORD;
i : byte;
begin
for i:=1 to 10 do B[i] := i;
W := PWord( Integer(@B[1]) + 0 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 2 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 4 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 6 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 8 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 0 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 2 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 4 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 6 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 8 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
← →
Verg (2003-09-25 15:01) [14]
> "присутствует обратный порядок байт". Как быть?
Господи...
WordVar := Swap(PWord(@ByteArray[num])^);
← →
han_malign (2003-09-25 15:20) [15]>"присутствует обратный порядок байт"
- дык, родной, разберись сначала чем Big endian от Low endian отличается, а потом людям голову морочь... А порядок самый что ни на есть "прямой" - от младшего байта к старшему.
← →
willys (2003-09-25 19:07) [16]а что, арифметикой уже никто не пользуется?! W := B1 + (B2 shl 8);
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c