자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 파이어몽키 소켓통신 - 질문수정
2019.12.17 09:42
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하십니까. 수고 많으십니다.
테스트 하면서 질문이 잘 못된거 같아서.. 삭제를 했다가.. 다시 정리해서 올립니다.
아래 소스를 Platforms를 Windows로 하고 실행을 하면
252
0
0
0
0
144
48
60
104
115
107
105
109
Size : 13
hskim
이렇게 나오는데 Platforms를 Android로 하고 실행을 하면
252
0
0
0
0
144
48
60
104
115
107
105
109
Size : 13
<hski
로 나옵니다. 교육받으면서 소켓으로 받을때 한자리 짤린다고 했던 부분이 이 현상 같습니다.
procedure TForm1.Button3Click(Sender: TObject);
var
Str : RawByteString;
Buf: TIdBytes;
i : integer;
begin
SetLength(Buf,13);
Buf[0] := 252;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0;
Buf[4] := 0;
Buf[5] := 144;
Buf[6] := 48;
Buf[7] := 60;
Buf[8] := 104;
Buf[9] := 115;
Buf[10] := 107;
Buf[11] := 105;
Buf[12] := 109;
SetLength(Str, Length(Buf));
Move(Buf[0],Str[1],Length(Buf));
Buf := nil;
SetLength(Buf,13);
Move(Str[1],Buf[0],Length(Buf));
for i := Low(Buf) to High(Buf) do begin
Memo1.Lines.Add(IntToStr(Buf[i]));
end;
Memo1.Lines.Add('Size : ' + IntToStr(Length(Str)));
Delete(Str,1,8);
Memo1.Lines.Add(Str);
end;
====================================
여러가지 형태로 TIdBytes를 RawByteString으로 바꾸는데..
결과는
252
0
48575
252
<hski
hskim
??0<hskim
<hski
형태로 나옵니다.
Str,Str4는 앞 4바이트 짤라서 숫자형으로 바꾸는건 맞는데 마지막 5바이트 문자는 잘못 나오고
Str2는 앞 4바이트 숫자형은 안바뀌는데 마지막 5바이트 문자는 잘 나옵니다.
procedure TForm1.Button2Click(Sender: TObject);
var
Str : RawByteString;
Str2 : RawByteString;
Str3 : RawByteString;
Str4 : RawByteString;
Buf: TIdBytes;
nSize : integer;
begin
Setlength(Buf,13);
Buf[0] := 252;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0;
Buf[4] := 0;
Buf[5] := 144;
Buf[6] := 48;
Buf[7] := 60;
Buf[8] := 104;
Buf[9] := 115;
Buf[10] := 107;
Buf[11] := 105;
Buf[12] := 109;
SetLength(Str, Length(Buf));
Move(Buf[0],Str[1],Length(Buf));
Str2 := TEncoding.ASCII.GetString(Buf);
Str3 := BytesToString(Buf);
SetLength(Str4, Length(Buf));
BytesToRaw(Buf, Str4[1], Length(Buf));
Move(Str[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str2[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str3[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str4[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Delete(Str,1,8);
Delete(Str2,1,8);
Delete(Str3,1,8);
Delete(Str4,1,8);
Memo1.Lines.Add(Str);
Memo1.Lines.Add(Str2);
Memo1.Lines.Add(Str3);
Memo1.Lines.Add(Str4);
end;
댓글 2
-
hs
2019.12.19 13:11
-
험프리
2019.12.23 09:48
조치결과를 남겨주셔서 감사합니다.
작성해 주신 내용 참고해 확인해 보니 안드로이드 플랫폼의 경우 0기반 문자열을 사용하는 것을 다시 확인했습니다.
iOS와 안드로이드 즉 모바일 컴파일러(DCCISOARM, DCCIOS32, DCCAARM)는 0기반 문자열을
윈도우와 OSX 즉 데스크탑 컴파일러(DCC32, DCC64, DCCOSX)는 1기반 문자열을 사용합니다.
만약 모바일과 데스크탑 컴파일러 모두 같은 기반 문자열을 사용하려면 {$ZEROBASEDSTRINGS ON/OFF} 지시어를 이용하시기 바랍니다.
http://docwiki.embarcadero.com/RADStudio/Rio/en/Zero-based_strings_(Delphi)
다음 링크의 예제를 참고하시기 바랍니다.
https://wiert.me/2015/01/14/delphi-zerobasedstrings-and-maintaining-cross-version-delphi-libraries/
——————
제안한 해결책으로 진행하신 결과가 성공이든 실패이든, 그 결과가 적힌 Q&A는 다른 사용자들의 시간을 크게 절약해줄 수 있습니다.
Firemonkey 파이어몽키 소켓통신 - 질문수정
2019.12.17 09:42
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하십니까. 수고 많으십니다.
테스트 하면서 질문이 잘 못된거 같아서.. 삭제를 했다가.. 다시 정리해서 올립니다.
아래 소스를 Platforms를 Windows로 하고 실행을 하면
252
0
0
0
0
144
48
60
104
115
107
105
109
Size : 13
hskim
이렇게 나오는데 Platforms를 Android로 하고 실행을 하면
252
0
0
0
0
144
48
60
104
115
107
105
109
Size : 13
<hski
로 나옵니다. 교육받으면서 소켓으로 받을때 한자리 짤린다고 했던 부분이 이 현상 같습니다.
procedure TForm1.Button3Click(Sender: TObject);
var
Str : RawByteString;
Buf: TIdBytes;
i : integer;
begin
SetLength(Buf,13);
Buf[0] := 252;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0;
Buf[4] := 0;
Buf[5] := 144;
Buf[6] := 48;
Buf[7] := 60;
Buf[8] := 104;
Buf[9] := 115;
Buf[10] := 107;
Buf[11] := 105;
Buf[12] := 109;
SetLength(Str, Length(Buf));
Move(Buf[0],Str[1],Length(Buf));
Buf := nil;
SetLength(Buf,13);
Move(Str[1],Buf[0],Length(Buf));
for i := Low(Buf) to High(Buf) do begin
Memo1.Lines.Add(IntToStr(Buf[i]));
end;
Memo1.Lines.Add('Size : ' + IntToStr(Length(Str)));
Delete(Str,1,8);
Memo1.Lines.Add(Str);
end;
====================================
여러가지 형태로 TIdBytes를 RawByteString으로 바꾸는데..
결과는
252
0
48575
252
<hski
hskim
??0<hskim
<hski
형태로 나옵니다.
Str,Str4는 앞 4바이트 짤라서 숫자형으로 바꾸는건 맞는데 마지막 5바이트 문자는 잘못 나오고
Str2는 앞 4바이트 숫자형은 안바뀌는데 마지막 5바이트 문자는 잘 나옵니다.
procedure TForm1.Button2Click(Sender: TObject);
var
Str : RawByteString;
Str2 : RawByteString;
Str3 : RawByteString;
Str4 : RawByteString;
Buf: TIdBytes;
nSize : integer;
begin
Setlength(Buf,13);
Buf[0] := 252;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0;
Buf[4] := 0;
Buf[5] := 144;
Buf[6] := 48;
Buf[7] := 60;
Buf[8] := 104;
Buf[9] := 115;
Buf[10] := 107;
Buf[11] := 105;
Buf[12] := 109;
SetLength(Str, Length(Buf));
Move(Buf[0],Str[1],Length(Buf));
Str2 := TEncoding.ASCII.GetString(Buf);
Str3 := BytesToString(Buf);
SetLength(Str4, Length(Buf));
BytesToRaw(Buf, Str4[1], Length(Buf));
Move(Str[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str2[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str3[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Move(Str4[1],nSize,4);
Memo1.Lines.Add(IntToStr(nSize));
Delete(Str,1,8);
Delete(Str2,1,8);
Delete(Str3,1,8);
Delete(Str4,1,8);
Memo1.Lines.Add(Str);
Memo1.Lines.Add(Str2);
Memo1.Lines.Add(Str3);
Memo1.Lines.Add(Str4);
end;
댓글 2
-
hs
2019.12.19 13:11
-
험프리
2019.12.23 09:48
조치결과를 남겨주셔서 감사합니다.
작성해 주신 내용 참고해 확인해 보니 안드로이드 플랫폼의 경우 0기반 문자열을 사용하는 것을 다시 확인했습니다.
iOS와 안드로이드 즉 모바일 컴파일러(DCCISOARM, DCCIOS32, DCCAARM)는 0기반 문자열을
윈도우와 OSX 즉 데스크탑 컴파일러(DCC32, DCC64, DCCOSX)는 1기반 문자열을 사용합니다.
만약 모바일과 데스크탑 컴파일러 모두 같은 기반 문자열을 사용하려면 {$ZEROBASEDSTRINGS ON/OFF} 지시어를 이용하시기 바랍니다.
http://docwiki.embarcadero.com/RADStudio/Rio/en/Zero-based_strings_(Delphi)
다음 링크의 예제를 참고하시기 바랍니다.
https://wiert.me/2015/01/14/delphi-zerobasedstrings-and-maintaining-cross-version-delphi-libraries/
——————
제안한 해결책으로 진행하신 결과가 성공이든 실패이든, 그 결과가 적힌 Q&A는 다른 사용자들의 시간을 크게 절약해줄 수 있습니다.
이게 맞는건지 모르겠지만. 안드로이드에서는 String 배열이 0부터 시작을 해야 하네요.
그런데 이상한게.. 1부터 해도
Memo1.Lines.Add(Str[9]);
이렇게 하나하나 찍어보면 맞게 나오는데
Copy 또는 Delete할때 문제가 발생합니다.
procedure TForm1.Button6Click(Sender: TObject);
var
Str : RawByteString;
TempStr : string;
Buf : TIdBytes;
i : integer;
begin
SetLength(Buf,13);
Buf[0] := 252;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0;
Buf[4] := 0;
Buf[5] := 144;
Buf[6] := 48;
Buf[7] := 60;
Buf[8] := 104;
Buf[9] := 115;
Buf[10] := 107;
Buf[11] := 105;
Buf[12] := 109;
SetLength(Str, Length(buf));
Move(buf[0], Str[0], Length(Str));
Buf := nil;
SetLength(Buf,13);
Move(Str[0],Buf[0],Length(Buf));
for i := Low(Buf) to High(Buf) do begin
Memo1.Lines.Add(IntToStr(Buf[i]));
end;
Memo1.Lines.Add('=====================');
for i := 0 to Length(Str)-1 do begin
Memo1.Lines.Add(IntToStr(Ord(Str[i])));
end;
Memo1.Lines.Add('=====================');
Memo1.Lines.Add(Str[8]);
Memo1.Lines.Add(Str[9]);
Memo1.Lines.Add(Str[10]);
Memo1.Lines.Add(Str[11]);
Memo1.Lines.Add(Str[12]);
Memo1.Lines.Add('=====================');
Memo1.Lines.Add(Copy(Str,9,5));
Memo1.Lines.Add('=====================');
Delete(Str,1,8);
Memo1.Lines.Add(Str);
end;