web-dev-qa-db-fra.com

Comment convertir des chaînes en tableau d'octets et inversement

4Je dois écrire des chaînes dans un fichier binaire MIDI. La norme exige que l'on connaisse la longueur de la chaîne en octets. Comme je veux aussi écrire pour mobile, je ne peux pas utiliser AnsiString, qui était un bon moyen de s'assurer que la chaîne était une chaîne d'un octet. Cela simplifiait les choses. J'ai testé le code suivant:

TByte = array of Byte;

function TForm3.convertSB (arg: string): TByte;
var
   i: Int32;
begin
   Label1.Text := (SizeOf (Char));
   for i := Low (arg) to High (arg) do
   begin
      label1.Text := label1.Text + ' ' + IntToStr (Ord (arg [i]));
   end;
end; // convert SB //

convertSB ('MThd');

Il renvoie 2 77 84 104 100 (sous forme de texte d'étiquette) sous Windows et Android. Est-ce à dire que Delphi traite les chaînes par défaut comme UTF-8? Cela simplifierait grandement les choses, mais je ne pouvais pas le trouver dans l'aide. Et quelle est la meilleure façon de convertir cela en un tableau d'octets? Lire chaque caractère et tester s'il s'agit de 1, 2 ou 4 octets et allouer cet espace dans le tableau? Pour reconvertir en caractère: lisez simplement le tableau d'octets jusqu'à ce qu'un octet soit rencontré <128?

13
Arnold

Les chaînes Delphi sont codées en interne au format UTF-16. Il y avait un gros indice dans le fait que SizeOf(Char) est 2.

La raison pour laquelle tous vos caractères avaient un ordinal dans la plage ASCII est que UTF-16 étend ASCII dans le sens où les caractères 0 à 127, dans la plage ASCII, ont la même valeur ordinale en UTF-16. Et tous vos personnages sont des caractères ASCII.

Cela dit, vous n'avez pas à vous soucier du stockage interne. Vous convertissez simplement entre chaîne et tableau d'octets en utilisant la classe TEncoding . Par exemple, pour convertir en UTF-8, vous écrivez:

bytes := TEncoding.UTF8.GetBytes(str);

Et en sens inverse:

str := TEncoding.UTF8.GetString(bytes);

La classe prend en charge de nombreux autres encodages, comme décrit dans la documentation . La question de savoir quel encodage vous devez utiliser n'est pas claire. J'espère que vous pourrez travailler le reste d'ici.

42
David Heffernan