2012-05-05 3 views
-1
이 같은 IdHttp를 사용하여 웹에서 파일을 다운로드하고 있습니다

는 :"문자열"에 "TMemoryStream이"를 변환하고 그 반대의

var 
MS: TMemoryStream; 

procedure Test1; 
var 
Http: TIdHTTP; 
begin 
Http := TIdHTTP.Create(nil); 
    try 
    MS := TMemoryStream.Create; 
    try 
     Http.Get('http://www.test.com/test.exe', MS); 
    finally 
     MS.Free; 
    end; 
    finally 
    Http.Free; 
    end; 
end; 

따라서, 다운로드 한 파일/스트림 (모르는 발음 방법)은 MS.Memory입니다.

음, MS.Memory을 문자열로 가져 오거나 그 반대로 변환하려고합니다.

는이 질문에 롭 케네디에 의해 게시 기능 시도했다 : Converting TMemoryStream to 'String' in Delphi 2009

을하지만 난 그냥 문자열을 가지고 : "MZP"

사람의 도움-날 수 있습니까?

+3

왜 'binary'데이터를 문자열로 변환해야합니까? 그것은 당신의 코드 목적에 대해 아무런 의미를 갖지 않습니다. – kobik

+0

@kobik, 내 프로그램은 내 '경쟁자'가 얻을 수없는 메모리에 dll을로드합니다. 불행히도, 누군가 얻었습니다 ... 그래서, 문자열로 dll을 쓰고 싶습니다.이 문자열은 MemoryStream으로 변환하여로드 할 수 있습니다. – paulohr

+0

@ TLama, 문자열 결과가있는'Get' 함수를 사용하면 MS.Memory에 포함 된 동일한 데이터가됩니까? – paulohr

답변

4

결과 문자열의 길이를 확인하십시오. 문자열에 모든 이진 파일이 들어 있다고 가정하지만 문자열 본문에 0으로 인해 ASCII 문자열로 볼 수는 없습니다. 실행 파일의 서명 (첫 번째 바이트) : 4D 5A 90 00. ASCII 기호 : MZP # 0 (P는 ANSI 키릴 문자이고 코드는 코드 페이지에 따라 다름).

0

TStringList 클래스의 LoadFromStream 메서드를 사용할 수 있습니다.

1

모든 exe, dll 파일에 서명이 있습니다. MZP # 0 ... pchar 문자열 (delphi의 거대한 문자열)의 경우 0은 문자열의 끝을 의미하고 디버그 속성은 MZP를 나타냅니다.

스트림의 원래 길이를 유지하면 모든 데이터에 액세스 할 수 있습니다.

1

다른 제안처럼, 바이너리 dll을 인코딩하지 않고 문자열로 변환하는 것은 의미가 없습니다. 하지만 이것이 정말로 필요한 경우, 다음을 사용할 수 있습니다 : TMemoryStream 대신 TStringStream 클래스. 및 TStringStream.DataString 속성은 문자열을 가져옵니다. 바이너리 데이터를 직접 문자열로 변환하면 불확실한 재사용이 발생할 수 있습니다. 인코딩 스키마 사용 : 예 : base64, 16 진수 문자열

관련 문제