2014-01-29 1 views
8

4 이진 MIDI 파일에 문자열을 써야합니다. 표준에서는 바이트의 문자열 길이를 알아야합니다. 모바일 용으로 쓰고 싶기 때문에 AnsiString을 사용할 수 없습니다. 이는 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 (레이블 텍스트로)을 반환합니다. 델파이가 기본적으로 문자열을 UTF-8로 취급한다는 의미입니까? 이것은 크게 단순화 할 것이지만 도움으로 찾을 수는 없습니다. 그리고 이것을 바이트 배열로 변환하는 가장 좋은 방법은 무엇입니까? 각 문자를 읽고 1, 2 또는 4 바이트인지 테스트하고 배열에서이 공간을 할당합니까? 다시 캐릭터로 변환하려면 : 바이트가 만날 때까지 바이트 배열을 읽는다. < 128?

+1

@Tlama - 그건 의도적으로 :-) MIDI 파일을 작성할 때 필자는 그런 식으로 정리할 수 있습니다. 필자는 델파이가 UTF-8 문자를 사용할 때 어떤 작업을하는지 궁금해했습니다. 자동으로 2 바이트 표현으로 바꿀까요? 그것은, 그리고 매우 흥미롭지는 않지만, Windows와 Android에서 그렇게 일관되게 적용됩니다. – Arnold

+0

실제로 질문에있는 코드의 문자는 실제로 2 바이트입니다. 그것이 SizeOf에 대한 호출이 여러분에게 말한 것입니다. –

답변

30

델파이 문자열은 내부적으로 UTF-16으로 인코딩됩니다. SizeOf(Char)이 2라는 사실에 큰 실마리가 있습니다.

모든 문자가 ASCII 범위에서 서수를 갖게 된 이유는 ASCII 범위에서 0에서 127까지의 문자가 UTF- UTF-16에서 같은 서수 값을가집니다. 그리고 모든 문자는 ASCII 문자입니다.

그렇다면 내부 저장 장치에 대해 걱정할 필요가 없습니다. TEncoding 클래스를 사용하여 문자열과 바이트 배열을 변환하면됩니다. 예를 들어, 당신이 쓰는 UTF-8로 변환 :

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

그리고 반대 방향으로 다음 documentation에 설명 된대로

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

클래스는, 다른 많은 인코딩을 지원합니다. 어떤 인코딩을 사용해야하는지는 분명하지 않습니다. 바라건대 여기서 나머지를 해결할 수 있기를 바랍니다.

+0

정확히 내가 무엇을 찾고 있었습니까. 감사! – Arnold

+1

나는 이미 추측 한 UTF-8로 파일을 읽고 쓰고 싶다. TEncoding은 많은 문자열 형식 질문을 해결하는 훌륭한 클래스입니다. 내 질문은 내가 직접 인코딩을해야한다는 두려움에 영감을 받았다. 따라서 내부 표현에 대한 질문이다. – Arnold