Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

        Data := Data + Chr(StrToInt('$' + temp[1] + temp[2])); 에서 data에 chr 이 누적이 안되네요 ㅠㅠ


강길남

질문

안녕하세요 ?

 

델파이에서 손을 놓은지 15년만에 스터디 좀 하고있습니다.

집에 있는 프로젝터를 on/off 하는 프로그램을 만들고 싶어서 웹 서핑 중 wol 프로시져를 찾아서 사용해 보았습니다.

Chr(StrToInt('$' + temp[1] + temp[2])); 여기 까지는 정상적으로 값이 생성됩니다.

그러나

Data := Data + Chr(StrToInt('$' + temp[1] + temp[2])); 

data 에 chr 값이 계속 붙어서 나와야 하는데 값이 전혀 없는것을 나타납니다.

이유를 모르겠습니다.

도움 부탁드립니다.

 

 

 

procedure TfrmServer.WakeUPComputer(aMacAddress: string);
var
  Data: String;
  temp: string;
  k, n: integer;
  idUDPClient: TIdUDPClient;

begin

  try

    SetLength(Data, 255);
    for k := 0 to 8 do
    begin
      Data := Data + Chr(StrToInt('$FF')); // 6x add a FF / 6x ein FF hinzufügen

//      Mm1.Lines.Add(data);

    end;
    temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);

    for k := 0 to 15 do
    begin
      temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);
      for n := 0 to 8 do
      begin
        // 16x add Target-Mac-Adress / 16x die Ziel-Macadresse hinzufügen
        Data := Data + Chr(StrToInt('$' + temp[1] + temp[2]));
        Mm1.Lines.Add(data);
        Delete(temp, 1, 2);
      end;
    end;


    try
      idUDPClient := TIdUDPClient.Create(NIl);
      idUDPClient.BroadcastEnabled := true;
      idUDPClient.Host := '192.168.1.21';
      idUDPClient.Port := 4352;
      idUDPClient.Send(Data);
    finally
      FreeAndNil(idUDPClient);
    end;
  except
  end;


end;

이 댓글 링크
다른 사이트에 공유하기

7 answers to this question

Recommended Posts

  • 0

올려주신 소스코드로 어떤 작업을 하시려는 건지 알려 주세요. 

Data := Data + Chr(StrToInt('$FF'))  이 수식에서 Data 가 정수가 아닌 문자열인데 for 문을 사용하는 이유가 뭔지요 ?

SetLength(Data, 255); 동적배열 메모리 할당인데 Data 는 동적배열로 선언이 안되어 있네요.

 

이 댓글 링크
다른 사이트에 공유하기

  • 0
On 2023. 3. 24. at 오후 6시 49분, c2design said:

SetLength(Data, 255); 동적배열 메모리 할당인데 Data 는 동적배열로 선언이 안되어 있네요.

Data 변수의 타입이 string이므로, SetLength를 사용할 수 있습니다. 

While you can assign data to a string in many ways, you can also allocate a specific amount of memory by calling the SetLength function. The parameter is the number of characters (of 2 bytes each), the string should be able to have. When you extend a string, the existing data is preserved (but it might be moved to a new physi- cal memory location). When you reduce the size, some of the content will likely be lost. Setting the length of a string is seldom necessary. The only common case is when you need to pass a string buffer to an operating system function for the given platform.

String에 데이터를 할당하는 방법이 많은데, SetLength를 호출하여 메모리 일정량을 할 당할 수 있다. 파라미터로는 String이 담을 수 있어야 할 만큼의 문자수이다 (참고로, 문자의 크기는 각각 2 바이트이다). String의 길이를 연장하는 경우, 기존에 들어있던 데이터는 보존된다 (하시만, 물리적인 메모리 상의 위치는 새 주소로 옮겨진다). String의 크기를 줄이면, 일부 내용을 잃게 될 수 있다. String의 길이 지정이 필요한 경우는 거의 없다. 가장 많은 경우는, 문자열 버퍼(string buffer) 를 플랫폼 운영 체제의 함수에게 전달할 필요가 있을 때 이렇게 한다.  

- 오브젝트 파스칼 핸드북 - 알렉산드리아 편 - 06: All about strings 장의 The String Data Type 절에 있는 내용

 

이 댓글 링크
다른 사이트에 공유하기

  • 0
On 2023. 3. 24. at 오후 2시 41분, 강길남 said:

되기는 하는데 예상했던 값이 아닌 다른 값들이 포함되어있네요. 


현재 내용만으로는 문제를 재현할 수 없어서 좋은 의견을 드릴 수 없습니다. 다만, 플랫폼 (및 컴파일 환경), 인코딩 등에 따라 다를 수 있습니다. 다른 값들이 어떤 것인지 확인해보기시 바랍니다.

참고로, 오브텍트 파스칼 핸드북에는 델파이에서 String을 어떻게 다루는 지가 잘 정리되어 있습니다. 그 원리를 이해하면 더 쉽게 문제를 파악할 수 있지 않을까 생각됩니다.

오브텍트 파스칼 핸드북 영문 PDF는 무료로 다운로드 받을 수 있습니다. 

이 댓글 링크
다른 사이트에 공유하기

  • 0
On 2023. 3. 24. at 오후 1시 24분, c2design said:

델파이 최신버전에서는 String 은 무조건 유니코드 입니다. (WideString)

2009버전 이후 현재까지, 델파이는 완전히 유니코드를 기반으로 합니다. String은  UnicodeString 타입이지, WideString 타입은 아닙니다.

<참고 및 근거>

델파이 현재 버전 (알렉산드리아 11.3) 기준 (실제로 2009 버전 이후 현재까지 모든 버전)에서

WideString 타입은 2009 버전 이전에도 있던 것으로써, COM 아키텍처를 지원할 수 있도록 하는 목적으로 현재에도 델파이에서 여전히 유지하고 있으며, 널리 사용되는 타입은 아닙니다.

System.WideString was previously used for Unicode character data. Its format is essentially the same as the Windows BSTR. WideString is still appropriate for use in COM applications.

System.WideString은 예전에 사용되던 타입이며, 유니코드 문자 데이터를 다룰 수 있다. WideString는 본질적으로 Windows BSTR과 형식(format)이 동일하다.  WideString은 여전히 COM 애플리케이션 안에서 사용하기에 알맞다. 

DocWiki에서 유니코드와 WideChar에 대한 설명 중에서

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.