conversion de array of byte en String

conversion de array of byte en String - Delphi/Pascal - Programmation

Marsh Posté le 26-08-2004 à 17:19:12    

Salut,
Je cherche depuis deux jour à convertir un tableau array of byte en String :bounce: , mais aucune des fonctions de transtypage que j'utilise ne marche :non: . Quelqu'un aurait il une idée de procéder?

Reply

Marsh Posté le 26-08-2004 à 17:19:12   

Reply

Marsh Posté le 26-08-2004 à 18:08:32    

en général une bête assignation ça marche
 
s := a;
 
où "a" est l'array et "s" la chaîne
 
à condition que ton array se finisse par un #0
 
sinon avec un StrLCopy, en faisant d'abord un SetLength sur ta variable de type string :
SetLength(s, longueur+1)
le +1 vu qu'il faut le zéro final, et tu donnes "longueur" à StrLCopy comme longueur max.

Reply

Marsh Posté le 27-08-2004 à 08:57:37    


function ByteToStr(T: array of byte): string;
const
  Digits: array[0..15] of char =
          ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
 
var
  I: integer;
begin
  Result := '';
  for I := Low(T) to High(T) do  
    Result := Result + Digits[(T[I] shr 4) and $0f] + Digits[T[I] and $0f];
end;

Reply

Marsh Posté le 27-08-2004 à 10:15:05    

salut, et merci de votre aide
martin95 est je ne comprend pas trop la ligne  
Result := Result + Digits[(T[I] shr 4) and $0f] + Digits[T[I] and $0f];  
peux stp m'y apporter des éclaircissement car je dois l'adapter à mon code!
en fait l'esprit de mon code est que je veux convertir une longitude donnée sous la forme O112445... est degrés minutes secondes.
 

Reply

Marsh Posté le 27-08-2004 à 11:27:28    

Le code qu'il t'a donné c'est pour générer une chaîne affichant la valeur hexa de l'array of byte fourni. Je doute que ce soit de ça que tu aies besoin...

Reply

Marsh Posté le 27-08-2004 à 12:03:41    

Ah ok! non c'est pas de ca dont j'ai exactement besoin!
Mais kan je fais une affectation simple comme tu me l'as suggéré ca me met un msg d'erreur type incompatible et dans mon code g déja un SetLength(Mon_table_array_of_byte, longueur+1) mais je ne vois pas ou placer le StrLcopy? et le rapprochement avec la conversion!

Reply

Marsh Posté le 27-08-2004 à 13:42:29    

Ton tableau de byte, il vient d'où ? Tu le remplis comment ? Donne un peu de code...


Message édité par antp le 27-08-2004 à 13:42:36
Reply

Marsh Posté le 27-08-2004 à 13:54:06    

function chaine_longitude(longitude: integer):ShortString;
// fonction renvoyant une chaîne de caractères degrés° minutes' secondes"
// et millisecondes à partir de la longitude en millisecondes
// à titre indicatif, car n'est plus utilisée par le logiciel
var  tableau_longitude: array of byte;
     temporaire: integer;
     degres: integer;
     centdegres: integer;
     minutes: integer;
     secondes: integer;
     ds:integer;
begin
    setlength(tableau_longitude,16);
    tableau_longitude[1]:=ord(' ');
    if longitude>=0
       then tableau_longitude[0]:=ord('E')
       else tableau_longitude[0]:=ord('O');
    temporaire:=Abs(longitude);
    degres:=(temporaire div 3600000);
    centdegres:=(degres div 100);
    tableau_longitude[2]:=48+centdegres;
    degres:=degres-centdegres*100;
    tableau_longitude[3]:=48+(degres div 10);
    tableau_longitude[4]:=48+(degres mod 10);
    tableau_longitude[5]:=ord('°');
    temporaire:=temporaire-degres*3600000;
    minutes:=(temporaire div 60000);
    tableau_longitude[6]:=48+(minutes div 10);
    tableau_longitude[7]:=48+(minutes mod 10);
    tableau_longitude[8]:=ord('''');
    temporaire:=temporaire-minutes*60000;
    secondes:=(temporaire div 1000);
    tableau_longitude[9]:=48+(secondes div 10);
    tableau_longitude[10]:=48+(secondes mod 10);
    tableau_longitude[11]:=ord('.');
    temporaire:=temporaire-secondes*1000;
    ds:=(temporaire div 100);
    tableau_longitude[12]:=48+ds;
    temporaire:=temporaire-ds*100;
    tableau_longitude[13]:=48+(temporaire div 10);
    tableau_longitude[14]:=48+(temporaire mod 10);
    tableau_longitude[15]:=ord('"');
    chaine_longitude:=string(tableau_longitude);
end;
 
C'est dans la dernière ligne que je veux récupérer dans chaine_longitude les valeurs de tableau_longitude.
 

Reply

Marsh Posté le 27-08-2004 à 14:02:19    

tu remplaces "tableau_longitude: array of byte" par "tableau_longitude: string" et ça marchera tout seul :D
À la limite tu déclares même rien du tout et tu utilises Result (c'est plus pratique que de taper le nom de la fonction ; toute fonction a une variable "Result" cachée).
 
Ça te permettra aussi de virer tous les ord(...) et à la place de 48+(...) tu mets '0'+(...), par exemple :
 
tableau_longitude[7]:='0'+(minutes mod 10);  
(si ça marche)
 
et fais gaffe : les chaînes commencent à 1, donc tu devras décaler de 1 tous tes chiffres entre [...]


Message édité par antp le 27-08-2004 à 14:02:58
Reply

Marsh Posté le 27-08-2004 à 14:29:32    

En fait ca ne peux pas marcher, je dois forcément le laisser en array of byte sinon ca flingue tt mon code, cette fonction est liée à plusieurs autres!
Ce ki m'arrangerait le plus c'est de convertir un array of byte en string, c'est kan meme dommage k'il n'y ai pas de fct ByteToStr :non: lol!

Reply

Marsh Posté le 27-08-2004 à 14:29:32   

Reply

Marsh Posté le 27-08-2004 à 14:33:22    

Tu mets un #0 dans la dernière case de ton tableau et tu fais un chaine := PChar(Tab); ça devrait marcher. Sinon il faut utiliser StrLCopy comme je l'ai dit pour copier le contenu de ton tableau dans une chaîne, en ayant d'abord fait un SetLength de ladite chaîne.

Reply

Marsh Posté le 27-08-2004 à 15:38:09    

Ca n'a pas marché, mais j'ai fis un truc tout con auquel je n'avais pas pensé, et ca marche nicquel!
En fait il faut faire un concat(chr(tableau_longitude[0]), chr(tableau_longitude, ...) et l'affecter au result de la fonction!
Le seul problème c'est qu'en mode debbug tu n'as pas accès au result pour des raison d'optimisation!
Aurait tu une idée, car ma fonction n'est pas affectable!

Reply

Marsh Posté le 27-08-2004 à 15:41:16    

C'est très crado ça :D
Tu fais Result := Result + Char(tableau_longitude[i]) dans une boucle où i va de 0 à longueur-1, et ça devrait aller aussi.
 
Pour éviter qu'il dise qu'on n'a pas accès à cause de l'optimisation, il suffit de la désactiver : Project -> Options -> Compiler -> tu décoches "optimisation". Puis tu vas dans Projet -> Build all pour tout reconstruire sans l'optimisation.
Il ne faudra pas oublier de la réactiver quand t'as fini.

Reply

Marsh Posté le 27-08-2004 à 16:50:50    

Nickel merci!
Au fait tu sais pas ou est ce ke je peux trouver sur le web, un code de conversion de cordonnées géographiques décimales (longitude, latitude, altitude) en degrés, minutes secondes?
J'aimerai vérifier mes résultats!
Bon we et merci :-P

Reply

Marsh Posté le 27-08-2004 à 16:56:53    

ce que j'avais fait pour décomposer des valeurs de longitude/latitude (où les degrés sont les nombes entiers) :
 
  Degres := Trunc(Value);
  Minutes := Trunc(Frac(Value) * 60);
  Secondes := Frac(Frac(Value) * 60) * 60;
 
Mais je suis pas sûr d'avoir pigé la question :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed