Hex to string și invers

Hex to String și invers

Maestre, vă rog să-mi spuneți cum să traduceți de la Hex la String și invers. Am, de exemplu, o anumită secvență de octeți: Buf: array of Byte

Trebuie să convertesc acest lucru într-un șir care conține formatul său HEX
s. șir de caractere. unde lungimea șirului este egală cu lungimea Buf * 2 și înapoi!

Pot exista anumite componente cu ajutorul cărora ar putea fi ușor de operat cu HEX?

Consultați formatul funcției ()


> Pat

Și cum să lucrez cu ea? formatul swill nu va fi o soluție [0]

AL1 # xA0; (11/21/04 18:35) # xA0;
Nu este nevoie, Hex deja String, respectiv, și invers.
Dar în subiectul însuși, deja vorbiți despre octeți.


> [2] al1 # xA0; (21.11.04 18:56)

Și pentru a lucra astfel: Format ("% x", [IntegerValue]).


> Maestrii vă rog să-mi spuneți cum să traduceți de la Hex la String
> și invers.

1.) De la HEX la String (mai degrabă, de la întreg, byte și alte tipuri întregi în șir în format HEX)
# xA0; a) funcția IntToHex (valoare: întreg; cifre: întreg): șir;
# xA0; b) formatul (explicat în postările anterioare)

2.) În schimb
# xA0; funcția StrToInt (const S: șir): Integer;

exemplu: # xA0; MyInteger: = StrToInt ("$" + MyString);

unde lungimea șirului este egală cu lungimea lui Buf * 2 și înapoi

Da, cred că înțeleg. Fiecare octet trebuie reprezentat ca două cifre hexazecimale. Atunci este posibil ca:

Mă înșel, nu
IntToHex (Buf [i])
dar așa cum este scris de SergP
IntToHex (Buf [i], 2)
Deși există și o problemă cu zero zero. Probabil fără Format aici este indispensabil, deși personal aș scrie direct conversia

Nu, am nevoie de ceva mai mult:
Am Buf: matrice de Byte, care are 6 octeți: 6D6F757365 și am nevoie, de exemplu, în s: String pentru a obține de la acest cuvânt mouse-ul și în SHex: string pentru a obține "6D6F757365". (Am o lungime de 5 caractere și o lungime SHE de 10 caractere)

De exemplu, trebuie să știu cum pot să convertesc de la Buf la String și StringinHex și invers!


> [9] al1 # xA0; (21.11.04 19:29)

Ceva pe care nu-l aveți în conservator, unde sunt 6 octeți, văd doar 5.


> [9] al1 # xA0; (21.11.04 19:29)

În general, procesați un șir într-o buclă, câte 2 caractere fiecare, transferați fiecare piesă în Byte cu StrToInt și apoi puteți obține caracterul corespunzător acestui cod folosind Chr ().

De ce îl bați pe tipul ăla? spune doar răspunsul și toate :)

var
# xA0; Buf: matricea Byte;
# xA0; S, SHex: String;
# xA0; I: Integer;

începe
# xA0; S: = "";
# xA0; SHex: = "";
# xA0; pentru I: = Scăzut (Buf) la Ridicat (Buf) nu
# xA0; începeți
# xA0; S = S + Chr (Buf [I]);
# xA0; # xA0; SHex: = Format SHx + ("% x", [Buf [I]])
# xA0; sfârșitul
end.

Ceva de genul ăsta, chtoli?

funcția HerZnaetChtoToString (var MyBuf: TMyArray): șir;
var
# xA0; i: întreg;
începe
# xA0; setlength (rezultat, High (MyBuf) -Low (MyBuf) +1);
# xA0; pentru i: = low (MyBuf) la High (MyBuf) nu
# xA0; rezultă [i-low (MyBuf) +1]: = chr (MyBuf [i]);
se încheie;

Nu am încercat asta în munca mea. Ar putea fi și să fie confundat în cazul în care firul.

IntToHex nu are o problemă zero la început.

Mulțumesc.

> începe. capăt

Și puteți sugera un cod pentru procesul invers?
(De la String la Buf)


> [21] al1 # xA0; (21.11.04 21:06)


> Și încă puteți solicita codul în procesul invers?
> (De la String la Buf)

Care este Stringul din S sau SHex?

Dacă vrei să spui SHEX, atunci poți face asta:

var
# xA0; Buf: matricea Byte;
# xA0; SHex: String;
# xA0; Eu, Len: Integer;

Lucrări, dar despre optimalitate - nu știu. Vreau să dorm, cred că sunt prost.

P.S. Îmi place Marea Baltică 7.

Mulțumesc. Se pare că funcționează!
O astfel de întrebare:
în timp ce (I. <= High(Buf)) do

dar cum să setați imediat dimensiunea potrivită pentru Buf?


> [24] al1 # xA0; (21.11.04 21:42)


> Și cum să expunem la o dată dimensiunea necesară Buf?

Mărimea necesară a Buf este setată în rândul: "SetLength (Buf, Len div 2);".

P.S. Puteți chiar Baltic 3.

Buclele în timp pot fi de asemenea înlocuite pentru, de ex. în schimb:


> Hmm. Nu-mi vedeți o bere. - (

Doar prin poștă! Țara? Orașul. -)

Nu, nu puteți vedea. Este puțin probabil să înțeleagă sugestiile groase și subtile pe care le înțelege :) Nu se poate înțelege.


> Nu se poate înțelege.

Încă nu sunt atât de beat încât nu mă înțeleg. -)

Și aici despre convertirea Hex-ului la un șir și vice-versa - am dat peste o grămadă de documentație. oriunde în gliding se explică. clar fără exemple. și nu există prea multe lucruri care să fie clare :-( Poate cineva să-mi spună unde să citesc totul în mod corespunzător? Voi fi recunoscător.)


> [30] al1 # xA0; (11/21/04 22:17)

Acum, toate sfaturile numai după plată în avans :-)

Reprezentare de date pe 16 biți.
Interval de la 0x00 la 0xFF
(dacă în int, apoi de la 0 la 255)

În primul rând, nu este o reprezentare a datelor pe 16 biți. Această reprezentare a numărului în sistemul hexazecimal al calculului. O reprezentare pe 16 biți este atunci când cifra 3 este scrisă în 16 biți de ceva. De exemplu
0000000000000003
sau
0000000000000101

Punctul cheie este "prezentarea". Reprezintă numai o persoană poate. Pentru un procesor standard, se pare că "există, nu". Pentru el, există un fel de reprezentare pe 16 biți, o reprezentare într-un sistem de calcul de 16 niveluri. Nu ai fost învățat în școală cum să traduci dintr-un sistem de calcul în altul?


> Nu ai fost învățat în școală cum să traduci dintr-un sistem de calcul
> în cealaltă este?

Chiar așa cum au învățat! Au fost prinși și învățați din nou. -)


> De exemplu
> 0000000000000003
> sau
> 0000000000000101

Aceasta este o reprezentare binară a datelor. -)
3 în întreg este 0x03 în Hex

V-am arătat ce capacitate pe 16 biți este, iar prima vedere nu este o reprezentare binară. acesta este cât de mult mai mult decât suficient (mai mult de trei). dar ambele reprezentări sunt de 16 biți

și ce este un număr întreg, poți să-mi spui?


> Și ce este un număr întreg, poți să-mi spui?

Bineînțeles că pot:
Întregul tip întreg. Range -2147483648..2147483647. Variabila Integer ia 4 biți (32 biți) în memorie. Formatul biților: cel mai semnificativ bit este semnul numărului, restul de biți (31 de piese) reprezintă numărul în sine.

Așa e. Integerul este un tip. descriind o variabilă și Hex este o reprezentare care prezintă o variabilă. Nu există nicio legătură între ele. Acum ce este un șir?


> Acum ce este un șir?

tip descrie o variabilă șir

SW. vrăjitor, vă rugăm să lăsați câteva linkuri către docuri unde puteți citi corect despre UTB! De asemenea, interesant de înțeles!
Mulțumesc.

Că sunteți chinuit.
Există, de asemenea, funcții minunate în Delphi - BinToHex și HexToBin.
Totul merge foarte bine.


> Există, de asemenea, funcții minunate în Delphi - BinToHex și HexToBin.

Am nevoie de un șir în Hex și nu BinToHex

Încă o dată, HEX are deja un șir

var buf. array de octet;
# xA0; # xA0; s. șir de caractere;
Buf: = s;

Tradus deja, dar numai un șir într-o serie de octeți, cu excepția cazului în care, desigur, compilatorul blestemă.

Ei bine și cum să învățați pe un simbol codul său?
(procesul invers al funcției Chr)


> [46] Al1 # xA0; (22.11.04 16:21)

> Ei bine, cum afli codul pentru simbol?

Ord ()

Dragi maeștri, se pare că am un rezultat:

tip ArrayOfByte = array de byte;

funcția Hex2StrHex (Buf de matrice de octeți; BufLength. integer): String;
var i. întreg;
începe
Rezultat: = "";
pentru I: = 1 la BufLength
începe
# xA0; Rezultat: = Rezultat + Format ("% x", [Buf [I]])
se încheie;
se încheie;

funcția Hex2Str (matrice de octeți BufLength.): String;
var i. întreg;
începe
Rezultat: = "";
pentru I: = 1 la BufLength
începe
# xA0; Rezultat: = Rezultat + Chr (Buf [I]);
se încheie;
se încheie;

funcția StrHex2Hex (șir șir; SHexLength. integer): ArrayOfByte;
var
I: Integer;

funcția Str2Hex (S. string; SLength integer): ArrayOfByte;
var
I: Integer;

începe
dacă (SLength> 0) atunci
începe
# xA0; SetLength (Rezultat, SLength);
# xA0; pentru I: = 0 la Ridicat (Rezultat)
# xA0; Rezultat [I]: = Ord (S [i + 1]);
se încheie;
se încheie;

Verificați vă rog, poate ceva să meargă bine?

Și mai mult o întrebare: și cum să declarați funcția (): matricea byte, care nu declară un tip nou: tip ArrayOfByte = array of byte.


> [48] Al1 # xA0; (11/22/04 17:13 PM)

Și ce pentru funcția de a transfera lungimile de rețele și linii atunci când ele (lungimi) pot fi definite în interiorul funcțiilor?

în cazul universalității. brusc uitați să scurtați linia, după ce ați lucrat cu ea. sau în tampon, să presupunem că trebuie să mâncați și să procesați o piesă și nu întregul. -)


> [50] Al1 # xA0; (11/22/04 5:28 pm)

Dar este posibil să amestecați ceva și să transferați, de exemplu, un număr mai mare decât este în general posibil. Și acest lucru va depăși deja granițele.

> [48] Al1 # xA0; (11/22/04 17:13 PM)


> funcția Hex2StrHex (Buză de octeți; BufLength. integer): String;

> pentru I: = 1 la BufLength do

A apărut o eroare. Buf: matricea Byte este o matrice OPEN. Pentru ei, ca și pentru cele dinamice, numerotarea elementelor începe de la zero. Aici, IMHO, este mai bine să înlocuiți matricea byte cu tipul pe care l-ați declarat deja - array dinamic - ArrayOfByte. Dar indicele va fi în continuare zero, așadar vă recomand să folosiți Low (Buf) și High (Buf) în loc de 1 și BufLength.

Memorie: 0,83 MB
Sincronizare: 0.079 sec

Articole similare