2009-09-04 7 views

Répondre

8

Vous pouvez déclarer un mot/Smallint au même endroit de la mémoire, comme ceci:

var 
    b : B02; 
    myInt: smallint absolute B02; 

Là encore, est-il une raison particulière pour laquelle vous ne vous contentez pas de créer le smallint et passez à ReadBuffer au lieu d'un tableau? Je ne sais pas exactement quelle classe vous utilisez, mais cela ressemble beaucoup à la façon dont vous lisez depuis un TStream, et il acceptera des variables de n'importe quel type, avec une taille en octets. Pourquoi ne pas simplement déclarer votre tampon comme le type entier que vous recherchez et supprimer l'intermédiaire?

+2

+1 pour avoir lu mon avis. Chaque solution répond à la question sauf si B02 contient des données de caractères. – skamradt

+0

Droite. Dans ce cas, vous ne voulez pas utiliser un entier pour cela. –

+1

Il se peut que les données sur le réseau soient stockées dans l'ordre des octets du réseau, pas celui d'Intel. – gabr

4

Si les données sont transmises dans l'ordre "réseau" (octet le plus élevé en premier) et non dans l'ordre "Intel" (octet le plus bas en premier), vous pouvez faire un certain nombre d'octets.

uses 
    SysUtils; 

var 
    b: B02; 
    w: word; //two bytes represent a word, not an integer 

socket.ReadBuffer(b, 2); 
WordRec(w).Hi := b[1]; 
WordRec(w).Lo := b[2]; 

Mghie suggéré approche suivante dans les commentaires (et je suis d'accord avec lui):

uses Winsock; 

var 
    w: word; 

socket.ReadBuffer(w, 2); 
w := ntohs(w); 
+2

+1, mais je n'aime toujours pas l'hypothèse implicite que le processeur est petit boutiste. Le code devrait lire dans un mot, appeler 'ntohs()' et transtyper en un 'SmallInt', alors cela fonctionnerait sur n'importe quel processeur (en utilisant FPC). – mghie

+1

@mghie: Vous avez totalement raison. Mais je l'écris toujours toujours de manière Intel uniquement. Ce habbit est difficile à casser :( – gabr

3

Vous pouvez juste jeter:

var 
    a: array[01..02] of Byte; 
    i: Integer; 
begin 
    i := PWORD(@a)^; 
end; 

ou si vous avez besoin de changer l'ordre des octets :

i := Swap(PWORD(@a)^); 
Questions connexes