web-dev-qa-db-ja.com

文字列をバイトの配列に変換して戻す方法

4文字列をバイナリに書き込む必要がありますMIDIファイル。標準では文字列の長さをバイト単位で知る必要があります。モバイル用にも書き込みたいので、AnsiStringを使用できませんでした。文字列が1バイトの文字列であることを確認するための良い方法です。これにより、次のコードをテストしました。

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');

WindowsとAndroidでは、2 77 84 104 100(ラベルテキストとして)を返します。これは、Delphiがデフォルトで文字列をUTF-8として処理することを意味しますか?これは大幅に簡略化しますが、ヘルプではそれを見つけることができませんでした。そして、これをバイトの配列に変換する最良の方法は何ですか?各文字を読み取り、それが1、2、4バイトのいずれであるかをテストし、このスペースを配列に割り当てますか?文字に戻すには、128バイト未満になるまでバイトの配列を読み取りますか?

13
Arnold

Delphi文字列は内部的にUTF-16としてエンコードされます。 SizeOf(Char)が2であることには大きな手がかりがありました。

すべての文字にASCII範囲の序数があった理由は、UTF-16がASCII範囲の文字0〜127の意味でASCIIを拡張するためです。 、UTF-16で同じ序数値を持つ。また、すべての文字はASCII文字です。

とはいえ、内部ストレージについて心配する必要はありません。 TEncoding クラスを使用して、文字列とバイト配列の間で変換するだけです。たとえば、UTF-8に変換するには、次のように記述します。

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

そして反対方向に:

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

documentation で説明されているように、このクラスは他の多くのエンコーディングをサポートしています。どのエンコーディングを使用する必要があるかという質問からは明確ではありません。うまくいけば、残りはここから解決できます。

42
David Heffernan