type B02 = tableau [01..02] de byte;Convertir un tableau d'octets en nombre entier dans Delphi
...
var b: B02;
...
// ici i lu à partir de socket TCP
socket.ReadBuffer (b, 2);
La question est: comment convertir B02 en nombre entier?
type B02 = tableau [01..02] de byte;Convertir un tableau d'octets en nombre entier dans Delphi
...
var b: B02;
...
// ici i lu à partir de socket TCP
socket.ReadBuffer (b, 2);
La question est: comment convertir B02 en nombre entier?
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?
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);
+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
@mghie: Vous avez totalement raison. Mais je l'écris toujours toujours de manière Intel uniquement. Ce habbit est difficile à casser :( – gabr
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)^);
+1 pour avoir lu mon avis. Chaque solution répond à la question sauf si B02 contient des données de caractères. – skamradt
Droite. Dans ce cas, vous ne voulez pas utiliser un entier pour cela. –
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