|
Тема
|
byte array -> record
|
|
Автор | lj (Нерегистриран) |
Публикувано | 26.02.04 09:19 |
|
imam edin packed record s 2 integer poleta
i edin array of byte, chiito razmer e raven na razmera (v bytes) na recorda.
opitvam se da kopiram pametta ot tozi byte-array varhu pametta na recorda i posle da vidq stojnostite na poletata ot recorda, samo che javno nestho ne e taka kakto si go predstavqm.
kazete mi molq edin packed record (na compilatora mu e kazano alignment = 1) kak se predstavq v pametta ?
moga li da ochakvam, che prosto sa zadeleni posledovatelno neobhodimite bytes za vsqko pole, primerno
field1 : integer - t.e. 4 bytes
field2: cardinal - t.e. 4 bytes
field3 : byte - t.e. 1 byte
i t.n.
?
iskam izkustveno da napravq "typecast" na edna porediza ot bytove kum edin record, samo che zasega nqmam uspeh.
primerno imam gornia record ot 3 poleta i imam edin array of byte 11 bytes, kojto ima stonosti:
0,0,0,1,0,0,2,0,90
moga li da go kopiram taka varhu recorda , che sled tova da se poluchi
field1 (integer (4 bytes)) = (0,0,0,1) = 1 + 0*256 + 0*256^2 + 0*256^3 = 1;
field2 (cardinal (4 bytes)) = (0,0,2,0) = 0 + 2*256 + 0*256^2 + 0*256^3 = 512;
field3 (byte (1 byte)) = 90;
?
zasega za filed1 vmesto 1 se poluchava 256^3 , t.e. izliza , che 1 se e kopiralo v naj-starhia byte ot integera, samo che ne moga da razbera zashto
| |
Тема
|
Re: byte array -> record
[re: lj]
|
|
Автор |
NikB (любопитен) |
Публикувано | 26.02.04 09:44 |
|
Дано това ти помогни да разбереш защо
unit Unit1;
interface
type
tRec = record
a : integer;
b : integer;
c : byte;
end;
tArr = array[0..8] of byte;
{}function Glupost(var Arr: tArr): tRec;
implementation
{}function Glupost(var Arr: tArr): tRec;
var
x: tRec absolute Arr;
begin
move(x,Result,sizeOf(Result));
end;
end.
Редактирано от NikB на 26.02.04 09:45.
| |
Тема
|
Re: byte array -> record
[re: NikB]
|
|
Автор | lj (Нерегистриран) |
Публикувано | 26.02.04 10:11 |
|
ami tova s absolut go probvah , no efecta e sashtia :(
| |
Тема
|
P.S:
[re: lj]
|
|
Автор | lj (Нерегистриран) |
Публикувано | 26.02.04 10:15 |
|
moje greshkata da e pri men - neznam.
ti tova probval li si go ?
ima li neshto po-specialno da se nastroi na compilatora osven record field alignment da e 1?
| |
Тема
|
Re: P.S:
[re: lj]
|
|
Автор |
NikB (любопитен) |
Публикувано | 26.02.04 11:26 |
|
Проблемът е, че компилаторът ползва подредбата на Интелските процесори.
Няма опция на компилатора, но може да има функции за обръщане на integer.
Ако си напишеш собствена с shl и събиране, вместо стеленуване - ще е ефективна като на асемблер.
l=b0;
l:=(((((l shl 8)+b1) shl 8)+b2) shl 8)+b3;
| |
Тема
|
Re: byte array -> record
[re: lj]
|
|
Автор |
SDR (TaskMaster) |
Публикувано | 26.02.04 12:16 |
|
mi ako ne ti se zanimawa s variant parts in record:
type
TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
TFigure = record
case TShapeList of
Rectangle: (Height, Width: Real);
Triangle: (Side1, Side2, Angle: Real);
Circle: (Radius: Real);
Ellipse, Other: ();
end;
mojesh da polzwash malko groznata ot gledna tochka na kompiliran kod tehnika:
type
t1=record
t1f1:type1;
t1f2:type2;
end;
p1=^t1;
t2=record
t2f1:type3;
t2f2:type4;
end;
p2=^t1;
var
v1:T1;
ptr2:P2;
....
ptr2=@v1;
v1.t1f1:=....
ptr2^.t2f1:=....
------------------------------
I got a COMPILER, and I'm not afraid to use it!
| |
Тема
|
taka
[re: SDR]
|
|
Автор | lj (Нерегистриран) |
Публикувано | 26.02.04 13:39 |
|
sled parvia otgovor si napravih edna funckia za RevferseBytes i varshi rabota.
a vizdam che i posledvaloto predlojenie e sashtoto :)
edinstvenoto neudobstvo idva ot tova che tozi buffer of bytes shte se nalaga da se "parsva" kam razlichni record typove.
i shte trqbva da pravq reverse na za vsqko pole rachno.
ta se chudq neshto , ama shte go pusna kato otdelen vapros ("poletata v pascalskia record") , shtoto mi se struva che e interesno samo po sebe si.
| |
Тема
|
Re: taka
[re: lj]
|
|
Автор |
Hateras (чакащ) |
Публикувано | 28.02.04 16:33 |
|
дори и да разбереш типовете в записа, пак ще трябва да реверсваш битовете
Am I evil?
Yes I am.
| |
Тема
|
Re: taka
[re: Hateras]
|
|
Автор |
SDR (TaskMaster) |
Публикувано | 29.02.04 13:05 |
|
BSWAP—Byte Swap
Description
Reverses the byte order of a 32-bit (destination) register: bits 0 through 7 are swapped with bits
24 through 31, and bits 8 through 15 are swapped with bits 16 through 23. This instruction is
provided for converting little-endian values to big-endian format and vice versa.
To swap bytes in a word value (16-bit register), use the XCHG instruction. When the BSWAP
instruction references a 16-bit register, the result is undefined.
IA-32 Architecture Compatibility
The BSWAP instruction is not supported on IA-32 processors earlier than the Intel486
processor family. For compatibility with this instruction, include functionally equivalent
code for execution on Intel processors earlier than the Intel486 processor family.
i az qsnota:
function bswapint (i:integer):integer;register;assembler;
asm
bswap eax
end;
------------------------------
I got a COMPILER, and I'm not afraid to use it!
| |
Тема
|
Tova "bswap" e nai efektivno
[re: SDR]
|
|
Автор |
NikB (любопитен) |
Публикувано | 29.02.04 16:57 |
|
Tova "bswap" e nai efektivno
| |
|
|
|
|