문제

나는 얻고 있었다 Rob Kennedy의 조언 그리고 제가 작업하고있는 앱의 속도를 크게 증가시키는 그의 제안 중 하나는 사용하는 것이 었습니다. SetString 그런 다음 표시 한 VCL 구성 요소에로드하십시오.

Delphi 2009를 사용하고 있으므로 이제 PCHA가 유니 코드이므로

SetString(OutputString, PChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;

작동하고 나는 그것을 PCHA로 직접 변경했지만 데이터가 이동중인 데이터가 항상 유니 코드는 아니기 때문에 실제로는 단락 데이터 .... 그래서 그가 실제로 사용한 것에 대해 다음과 같습니다.

SetString(OutputString, PAnsiChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;

아무것도 나타나지 않지만 디버거를 확인하고 일반적으로 과거에 한 번에 1 char를 구축 한 방식으로 나타나는 텍스트는 변수에있었습니다.

이상하게도 이것은 내가 오늘 밤에 처음으로 달려 갔을 때가 아닙니다. 나는 다른 방법을 생각해 내려고했기 때문에 그의 조언에 참여했고 VCL의 tcaption에 구축하는 대신 문자열 변수로 만들어서 복사했지만 아무것도 표시 할 때 아무것도 표시되지 않습니다. 디버거에서 다시 한 번 데이터가 내장 된 변수는 데이터가 있습니다.

for I := 0 to OutputLength.Value - 1 do
begin
  OutputString := OutputString + Char(OutputData^[I]);
end;
edtString.Text := OutputString;

위의 것은 작동하지 않지만 그것을하는 오래된 느린 방법은 잘 작동했습니다 ....

for I := 0 to OutputLength.Value - 1 do
begin
  edtString.Text := edtString.Text + Char(OutputData^[I]);
end;

변수를 단락, 문자열 및 tcaption으로 만들려고했지만 아무것도 표시되지 않습니다. 내가 흥미로운 것은 같은 배열에서 hex 데이터를 부자로 빌드하는 동안 텍스트 데이터의 편집 내에서 수행하는 동안 매우 빠릅니다. 매우 느립니다. 그렇기 때문에 Richedit의 코드를 변경하려고 노력하지 않았습니다.

추가 할 편집 - 문제를 발견했지만 해결책이 없다고 생각합니다. 디버거의 값을 편집하여 표시 할 수없는 것을 제거하기 위해 (기존 메소드가 표시되지 않아서 실패하지 않음) 내가 남은 내용이 표시됩니다. 그래서 그것이 쓰레기 인 캐릭터로 바뀌는 바이트를 제거하는 문제라면 어떻게 고칠 수 있습니까?

나는 기본적으로 육각 편집자 스타일이 표시되는 SCSI 장치의 생생한 데이터를 가지고 있습니다. 한 번에 하나의 숯을 추가하는 원래의 느린 스타일은 유니 코드 별 문자가없는 문자열과 유니 코드 문자열을 성공적으로 표시했습니다. 작업이 단락이 한 방향으로 표시되지 않더라도 더 빠른 방법은 0-255자가 사용하지 않는 유니 코디 링을 표시하지 않습니다. 나는 속도 부스트를 정말 좋아하고 사용할 수 있지만 그것이 문자열을 읽는 능력을 희생한다는 것을 의미한다면 ... 앱의 요점은 무엇입니까?

edit3- 이제 0-31이 제어 char이고 32 이상이 유효하다는 것을 알아 냈기 때문에 나는 숯을 걸러 내고 유효하지 않은 것을 a로 교체하려고 시도 할 것이라고 생각합니다. 이것은 나중에 육각 편집기 스타일을 모방하기 위해 계획했던 것입니다.

다른 제안이 있다면 나는 그들에 대해 듣고 기뻐하지만 그렇지 않으면 원본보다 빠른 솔루션을 만들 수 있고 동시에 필요한 일을 할 수 있다고 생각합니다.

도움이 되었습니까?

해결책

나는 사용했다 PAnsiChar 내 예에서 이유가 있습니다. 그것은 보였다 OutputLength 문자가 아닌 바이트로 측정되었으므로 길이가 항상 바이트로 측정되는 유형을 사용해야했습니다. 또한 내가 선언을 보여 주었다는 것을 알게 될 것입니다 OutputString 로서 AnsiString.

그러나 편집 제어가 저장된 유니 코드이므로 AnsiString 그리고 UnicodeString. 그것은 시스템의 현재 코드 페이지를 고려할 것이지만 아마도 당신이 원하는 것이 아닐 것입니다. 변수를 a로 선언 할 수 있습니다 RawByteString 대신에. 그것은 그것과 관련된 코드 페이지가 없으므로 예상치 못한 변환이 없을 것입니다.

이진 데이터를 저장하기 위해 문자열을 사용하지 마십시오. 16 진 편집자에 대한 금액을 구축하는 경우 이진 데이터로 작업하고 있습니다. 그것을 기억하는 것이 중요합니다. 이진 데이터라도 발생합니다 텍스트로 해석 될 수있는 주로 바이트로 구성 되려면 데이터를 텍스트로 취급 할 수 없거나보고있는 문제 (예상대로 나타나지 않는 문자)가 정확히 문제를 해결할 수 있습니다. SCSI 장치에서 많은 바이트를 얻으면 문자가 아닌 바이트 배열에 저장하십시오.

16 진 편집자에서는 항상 바이트의 16 진수 값을 보여줍니다. 그들은 캐릭터로 해석 된 바이트를 보여줄 수 있지만, 그것은 보조이며, 일반적으로 ASCII 문자를 나타내는 바이트 만 보여줍니다. 그들은 기본 디스플레이로 너무 화려하게 만들려고하지 않습니다. 그만큼 좋은 16 진 편집자는 광범위한 문자로 해석 된 데이터도 표시 할 것입니다. 사용자는 여러 가지 방법으로 동일한 데이터를 볼 수 있으므로 디버깅에 도움이됩니다. 그러나 그들은 단지 그저 견해 데이터의. 그들은 실제로 데이터의 이진 내용을 변경하지 않습니다.

다른 팁

몇 가지 의견 :

  1. 귀하의 질문은 매우 불분명합니다. 정확히 무엇을하고 싶습니까?
  2. 귀하의 질문은 끔찍합니다. 맞춤법 검사기로 텍스트를 확인하십시오.
  3. 당신이 언급하는 질문은 이것입니다. 델파이는 유형화되지 않은 포인터에서 채워진 동적 배열에서 데이터에 액세스
  4. 이전 질문에서했던 것처럼 기능의 완전한 코드 샘플을 제공하십시오. Rob Kennedy의 제안 또는 다음 답변에서 자신을 준 코드를 구현했는지 알고 싶습니다 (희망하지 말고 :)).
  5. 지금까지 귀하의 질문을 이해합니다. SCSI 장치에 쿼리를 보내고 있으며 변수 출력 데이터에 저장하는 바이트 배열을 얻습니다. 그 후에는 사용자에게 데이터를 표시하려고합니다. 그래서 당신의 진짜 질문은 다음과 같습니다. 사용자에게 바이트 배열을 표시하는 방법은 무엇입니까?
  6. 동일한 사용자로 로그인하고 모든 새로운 질문에 대한 계정을 작성하지 마십시오. 그렇게하면 우리는 귀하의 질문 기록을 추적 할 수 있습니다.

내가 당신의 질문의 진정한 의미에 대해 옳다면 몇 가지 가정과 제안 :

  1. 16 진수로 데이터를 표시하면 아무런 문제가 없습니다.
  2. 델파이 문자열에는 0 바이트를 포함한 모든 문자를 포함 할 수 있지만 일반 메모 필드에 데이터를 보여 주면 문제가 발생할 수 있습니다. 예를 들어 Tmemo는 처음 0 바이트까지 데이터를 표시합니다. 당신이해야 할 일 (그리고 당신은 스스로 답을 주었고), 볼 수없는 캐릭터를 더미로 대체하는 것입니다. 그 후에는 데이터를 tmemo로 보여줄 수 있습니다. 실제로 모든 16 진수 시청자는 동일하게 수행하며 인쇄 할 수없는 문자는 점으로 표시됩니다.

볼 수없는 문자를 걸러 내면 #9 (탭), #10 (LF), #11 (verticle 탭), #12 (ff- 또는 새 페이지),#13 (CR)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top