繁体   English   中英

C客户端套接字数据无法在Java Server中读取

[英]C Client socket data not able to read in Java Server

当字节数组转换为字符串时,Java Server套接字给出了错误的输出。 C套接字头格式

int  tccode 4
int  len    4
char data[4088] 4088

C结构格式

Tc Code :1001   Size : 256  
#ifdef   __DTGPL1T__                                                                                                   
struct DTGPL1T_S                                                                                                    
{                                                                                                   
      // ENTRY ZONE 
      short       por1cur; 
      short       por2cur; 
      short       por1ten;
      short       por2ten;
      short       p1lvim1;
      short       p1lvim2;
      short       p1lvim3; 
      short       p2lvim1;
      short       p2lvim2;
      short       p2lvim3; 
      short       brc1 ;
      short       entrylt;                                                                                     short       enlopcar;                                                                                                    
      short       notchlen;                                                                                                 
      short       poruse;                                                                                                     
      short       p1remain;                                                                                                 
      short       p2remain;                                                                                                 
      short       eloopcap;                                                                                            
      short       elooplen;                                                                                               
      short       untielen;                                                                                                 
      short       entryspd;                                                                                         
      short       st8ten; 
      short       brc2  ; 
      short       scbtns; 
      short       scbel ; 
      short       scb1intr;
      short       scb2intr;
      short       scb3intr;
      short       st3ten; 
      short       brc3  ; 
      short       plettkts; 
      short       deli1ten; 
      short       d1loopcc;
      short       d1loopln; 
      short       d1loopcp;
      short       brc4  ; 
      short       br4ten;
      short       plcspd; 
      short       triwidt; 
      short       sthosingwidth  ; 
      short       trigap1;
      short       trigap2; 
      short       trigap3;
      short       trigap4;
      short       trilap1; 
      short       trilap2; 
      short       trilap3; 
      short       trilap4;
      short       aactwid; 
      short       adevwid;
      short       chopw ; 
      short       chopd ; 
      short       tristat;
      short       trispd; 
      short       trmtoplen; 
      short       deli2ten; 
      short       d2loopcc; 
      short       d2loopcp;
      short       d2loopln;                                                                                                   
      short       br5ten; 
      short       brc5  ; 
      short       wpd1sta;
      short       wpd2sta; 
      short       wpd3sta;
      short       wpd3asta;
      short       wpd4sta;
      short       wpd5sta;
      short       chvsen[2]; 
      short       wbsen[2]; 
      short       etcsen;
      short       wpdpass[6];
      short       wpdlen[6];
      short       pl_cv_next_move;                                                                                                   
      short       ccv1_lock_curr ;   
      short       ccv2_lock_curr ;  
      short       ewb1_lock_curr ; 
      short       ewb2_lock_curr ;
      short       etc_lock_curr  ; 
      short       eskd1_lock_curr;
      short       eskd2_lock_curr; 
      short       ecc1_lock_curr ; 
      short       ecc2_lock_curr ;
      short       st_wid_low_err ;

      short       st_wid_upp_err ; 


      short       trim_width_set;                                                                                           
      short       hadling_time;                                                                                                   

      short       spare01[14]    ;

      short       spare02[16]    ;

      //38 + 16 = 53 

};                                                                                                  
typedef struct DTGPL1T_S       DTGPL1T_T;                                                                                                   
typedef        DTGPL1T_T       *DTGPL1T_P;                                                                                                  
#define        DTGPL1T_LN      sizeof(DTGPL1T_T)                                                                                                    
#endif      // Eof of __DTGPL1T__  

和Java服务器代码

DataInputStream in = new DataInputStream(clientSocket.getInputStream());
     //DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
     int tcCode = in.readInt();
     int length = in.readInt();
     if(tcCode == 1001) {

            byte[] messageByte = new byte[length];
            boolean end = false;
            StringBuilder dataString = new StringBuilder(length);
            int totalBytesRead = 0;
            while(!end) {

                int currentBytesRead = in.read(messageByte);
                totalBytesRead = currentBytesRead + totalBytesRead;
                if(totalBytesRead <= length) {                      
                    dataString
                      .append(new String(messageByte, 0, length - totalBytesRead + currentBytesRead));

                } else {
                    dataString
                      .append(new String(messageByte, 0, length - totalBytesRead + currentBytesRead));
                }
                if(dataString.length()>=length) {
                    end = true;
                }
            }
            System.out.println("Message1  "+dataString);
            }

MessageBytes像 [-1,-2,0,0,0,0,0,0,0,35,0,33,0,30,0,45,0,40,0,35,0,0, 0,0,-1,-1,0,10,0,1,0,1,0,1,5,-123,0,111,3,34,0,0,0,0,0,0 ,2,-25、0、24,-1,-2,-1,-3、0、0、0、0、0、43、37,-1,-35、0、0、0, 72、10、42、0、0、43、37、0、0、49、126、112,-30、0、5、0、5、0、11、0、12,-3、68,-3 ,68,-6,-20,-6,-20,27,86,0,0,0,16,0,16,0,0,0,0,0,-13,-1,-7, 0,0,16,107,0,-99,0,80,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-20,4,-73, -1、74,-1] [输出屏幕截图] 1

与C语言不同,Java String不适合保存字节。 将字节转换为字符串会解码字节,这意味着某些值可能会更改或丢失。

即使未更改任何值,您的数据也不会表示字符,因此将其打印为文本将显示无意义。 例如,您的许多字节为零,因为字符\是非打印控制字符,因此在输出中根本不显示。

您应该完全避免使用Strings和StringBuilders。 相反,仅将字节存储在字节数组中:

while (totalBytesRead < length) {
    int currentBytesRead = in.read(messageByte,
        totalBytesRead, length - totalBytesRead);
    totalBytesRead = currentBytesRead + totalBytesRead;
}

您的数据似乎完全由short值组成,因此,假设C客户端被构建为将short视为16位值,并且假设C编译器未填充struct成员以对其进行字对齐,则可以使用ByteBufferShortBuffer将字节转换为短裤序列:

ByteBuffer buffer = ByteBuffer.wrap(messageByte);
ShortBuffer shortBuffer = buffer.asShortBuffer();

要打印它们,请以数组形式检索它们并使用Arrays.toString

short[] values = new short[length / 2];
shortBuffer.get(values);
System.out.println(Arrays.toString(values));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM