2015-01-28 1 views
1

는 워드는 16 비트의 부호없는 변수 (0..65535)Delphi의 "Word"는 Java의 "Char"와 동일한 변수입니까? 델파이

http://www.delphibasics.co.uk/RTL.asp?Name=Word

자바 숯 변수가 16 비트 유니 변수 (0..65535)이다

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

나는 t을 나는 자바에 델파이에 01 03 00 20 F01 3 0 D8 D9를 얻을

for (Byte b : lst) 
S = S + String.format("%1X ", b); 

내가 수행하여 값을 인쇄 할 때

procedure TForm1.ReadHoldRegisters(var lst: TList<byte>; deviceaddr: byte; 
    RegisterAddress, RegisterLength: word); 
begin 

    lst.Add(deviceaddr); 
    lst.Add(3); 
    lst.Add(RegisterAddress div 256); 
    lst.Add(RegisterAddress mod 256); 
    Add_CRC16(lst); 
end; 

procedure TForm1.Add_CRC16(var Data: TList<byte>); 
var 
    CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo: byte; 
    Flag: Integer; 
    b: byte; 
begin 
    CRC16Lo := $FF; 
    CRC16Hi := $FF; 
    CL := $1; 
    CH := $A0; 

    for b in Data do 
    begin 
    CRC16Lo := CRC16Lo Xor b; 
    For Flag := 0 To 7 Do 
    Begin 
     SaveHi := CRC16Hi; 
     SaveLo := CRC16Lo; 
     CRC16Hi := CRC16Hi Div 2; 
     CRC16Lo := CRC16Lo Div 2; 

     If ((SaveLo And $1) = $1) Then 
     Begin 
     CRC16Hi := CRC16Hi Xor CH; 
     CRC16Lo := CRC16Lo Xor CL; 
     End; 



    End; 
    end; 
    Data.Add(CRC16Lo); 
    Data.Add(CRC16Hi); 
end; 

델파이에 다음 코드 그는 그리고 자바

public void ReadHoldRegisters(List<Byte> lst, byte deviceaddr, char RegisterAddress, char RegisterLength) 
     { 

      lst.add(deviceaddr); 
      lst.add((byte) 3); 
      lst.add((byte) (RegisterAddress/256)); 
      lst.add((byte) (RegisterAddress%256)); 

      Add_CRC16(lst); 

     } 

    private void Add_CRC16(List<Byte> Data) 
    { 
     char SaveLo, SaveHi; 
     int flag; 


     char CRC16Lo = 0xFF; 
     char CRC16Hi = 0xFF; 
     char CL  = 0x1; 
     char CH  = 0xA0; 


     // início do for in 
     for (Byte b : Data) 
     { 
      CRC16Lo = (char) ((CRC16Lo)^b); 
      for(flag=0;flag<7;flag++) 
      { 
       SaveHi = CRC16Hi; 
       SaveLo = CRC16Lo; 
       CRC16Hi = (char) (CRC16Hi/2); 
       CRC16Lo = (char) (CRC16Lo/2); 
/* 
       if((SaveHi & 0x1) == 0x1) 
       { 
        CRC16Lo = ((char) (CRC16Lo|0x80)); 
       } 
*/ 
       if((SaveLo & 0x1) == 0x1) 
       { 
        CRC16Hi = ((char) (CRC16Hi^CH)); 
        CRC16Lo = ((char) (CRC16Lo^CL)); 

       } 
      } 
     } 
     // fim do for in 

     CRC16Hi = (char) (CRC16Hi & 0xffff); 
     CRC16Lo = (char) (CRC16Lo & 0xffff); 

     Data.add((byte) CRC16Lo); 
     Data.add((byte) CRC16Hi); 

    } 

에 상응입니다 .

char 및 word가 동등한 변수라고 가정 할 때 RegisterAddress 및 RegisterLength에 어떤 문제가 있습니까?

+1

델피'워드 '는 부호없는 16 비트 타입입니다. 나는 자바'char'이 같다고 생각한다. 그 차이가 엔디안 일 수 있습니까? 자바는 빅 엔디안이고 델파이는 리틀 엔디안입니다. –

+3

다른 제안은 디버깅을하는 것입니다. 왜 무력하니? 각 프로그램에 중간 값을 기록하십시오. 프로그램의 분기점을 발견하십시오. 그러면 문제를 이해하게 될 것입니다. 그리고 스스로 해결할 수 있어야합니다. –

+0

차이가 엔디안 인 경우 전체 코드에 대한 변경 사항일까요 아니면 최종 값일까요? – Machado

답변

3

당신이 말했듯이, Delphi Word은 부호없는 16 비트 유형입니다. Java char도 마찬가지로 부호없는 16 비트 유형입니다.

그러나 질문에 Word을 언급했지만 코드에는 나타나지 않습니다. 글쎄, 에 Word을 사용하지만 Add_CRC16에 아무데도 사용하지 않는 것은 Word 유형입니다. 따라서 Word을 사용하고 있지 않습니다. Byte을 사용 중입니다. 따라서 Add_CRC16의 두 변종은 그 때문에 크게 다릅니다.

나머지 코드는 살펴 보지 않았지만 델파이의 경우 8 비트 Byte과 자바의 경우 char 사이의 불일치가 가장 눈 부시다. 먼저 문제를 수정하고 다음에 무엇이 올지 살펴보십시오.

마지막으로, Delphi Basics 웹 사이트, 특히 참조 자료는 피하는 것이 좋습니다. 당신은 공식 문서에 훨씬 더 잘 부합합니다. 이 질문에 대한 관련 문서는 Delphi Data Types입니다.

+0

..... RegisterAddress, RegisterLength : word) – Machado

+0

예. 나머지 코드는 무엇입니까? –

+0

그것이 내 코드를 해결하지 못한다고 생각합니다. 도와 주셔서 감사합니다. – Machado

3

분명히 WideChar (고전적인 Delphi) 또는 Just Char (Delphi 2009 이후)가 더 적절할 것입니까?

+0

더 구체적으로 설명 해주시겠습니까 델파이 코드가 어떻게 작동해야합니까? – Machado

+3

@ penarthur66 델파이 코드에서'Char'도'WideChar'도 의미가 없습니다. 자바 코드는'char'를 사용합니다. 아마도 언어에서 유일한 부호없는 타입이기 때문입니다. 델파이'Word'는 사운드 선택입니다. –

관련 문제