string
및 array[] of Byte
을 직접 할당 할 수 없기 때문에이 오류를 직접 무시할 수 없습니다.
이후 바이너리 내용 (특히 #0
문자, 또는 0x00
16 진수 값 (C/C++)) 디스플레이되지 않습니다 어쨌든 (텍스트가 처음 #0
값으로 종료 될 것입니다)를 TMemo
, 당신은 좋겠에서 그것을 대체해야합니다.
쉬운 방법은 컴파일러 오류가 array[] of Byte
에서 직접 string
에 할당 할 수 있습니다 array[] of AnsiChar
에 배열을 변경하는 것입니다 과거를 얻을 (또는 1에 형태 캐스트)합니다 :
var
Buffer: array[0..1023] of AnsiChar;
TempStr: string;
begin
// Fill buffer from stream
TempStr := Buffer;
Memo1.Lines.Add(TempStr);
// The next line eliminates the need for `TempStr`
// Memo1.Lines.Add(String(Buffer));
end;
그러나, 같은 나는 이것이 메모에 표시하는 문제를 해결하지 못할 것이라고 말했다. 예를 들어 실제로 Windows 실행 파일을 읽을 때 첫 번째 버퍼는 MZP
을 표시합니다. 네 번째 바이트는 #0
이고 메모는 문자열을 종료하기 때문입니다.
이 제한을 극복하려면 #0
문자를 다른 것으로 바꿔야합니다. 그 문제는 당연히 당신이 바꿀 수있는 어떤 값도 실제로는 실행 파일에서 발생할 수 있다는 것입니다 (바이트이기 때문에 가능한 값은 256 개뿐입니다).
var
Buffer: array[0..1023] of AnsiChar;
i: Integer;
TempStr: string;
begin
// Fill buffer as before
for i := Low(Buffer) to High(Buffer) do
if Buffer[i] = #0 then
Buffer[i] := `Ø`; // Try #144 instead
TempStr := Buffer;
Memo1.Lines.Add(TempStr);
// You can still eliminate the string variable by typecasting
// Memo1.Lines.Add(String(TempStr));
end;
여기서, 실제로 델파이 콘솔 응용 프로그램에서 1K 버퍼를 읽는 TForm.FormCreate
이벤트에 대한 코드가의 위의 교체를 수행하고 디스플레이 : 다시, 간단한 해결책은 0
(# 216) 모든 #0
문자를 대체하는 것입니다 TMemo
의 콘텐츠 TMemo
을 양식에 놓고 Alignment
속성을 alClient
으로 설정하고 ScrollBars
을 ssVertical
으로 설정합니다. 폼에 FormCreate
이벤트 핸들러를 추가하고 해당 이벤트에 대한 다음과 같은 코드를 사용
procedure TForm1.FormCreate(Sender: TObject);
var
Stream: TFileStream;
Buffer: array[0..1023] of AnsiChar;
TempStr: string;
i: Integer;
begin
Memo1.Clear;
// Populate buffer elements
Stream := TFileStream.Create('D:\Temp\Project2.exe', fmOpenRead);
try
Stream.Read(Buffer[0], SizeOf(Buffer));
finally
Stream.Free;
end;
// Replace null (#0) values with #216 (Ø)
for i := Low(Buffer) to High(Buffer) do
if Buffer[i] = #0 then
Buffer[i] := 'Ø';
TempStr := Buffer;
Memo1.Lines.Add(TempStr);
end;
참고 : 실제로 대신 첫 번째 버퍼의 전체 이진 파일을 읽는 경우, 마지막 버퍼가되지 않을 수도 있습니다 완전히 파일 내용으로 가득 차 있습니다 (마지막 단계에서 전체 버퍼를 읽을 수 없음). 이 경우, 버퍼의 끝을 #0
으로 표시하여 메모가 부분 버퍼를 올바르게 표시하도록합니다.
음, 파일의 텍스트 인코딩이 무엇 :
여기에 전체 단일 버퍼를 읽기의 출력이있다 : 당신은 같은 것을 사용하는
for
루프를 변경할 수 있습니까? –@DavidHeffernan : 텍스트가 아닙니다. 포스터는 .EXE 파일의 내용을 메모에 1K 바이트 단위로 표시하려고합니다. ??? –
... EXE에 포함 된 텍스트가 UTF-16 일 가능성이 있습니까? –