打印从Java到C接收的字节

时间:2017-05-16 04:58:24

标签: java android c linux sockets

我正在尝试将Android手机中的字节发送到我的Raspberry Pi。当我发送它时,我收到了一些奇怪的符号:5000 +奇怪的符号。收到的字节只能是数字形式的吗?

这是我在Android上的代码。

socket.getOutputStream().write(String.valueOf("5000").getBytes());

这是我在Raspberry Pi上接收的代码。

char Buffer[1024];
nread = recv(clientSocket,Buffer,1024,0);
printf("Data Received: %s",Buffer);

显然,我对套接字很新。另外,我当前在java中发送的字节应该是我在RPI上接收的字节数?如果有人能向我解释,我将非常感激!

4 个答案:

答案 0 :(得分:1)

代码socket.getOutputStream().write(String.valueOf("5000").getBytes());发送4个字节,因为Java仅使用16位字符表示Java Language Specification 3.10.5中指定的非ASCII字符。

可以肯定的是,您必须在C程序中打印nread的值。

代码nread = recv(clientSocket,Buffer,1024,0);收到4个字符,并且DOESN' T把零终止字符串,所以printf显示(非初始化)缓冲区的内容,我建议memset( Buffer, 0, sizeof( Buffer ))

代码建议:

if( nread < 0 ) {
   perror("Read error");
   return;
}
Buffer[nread] = '\0';

为了对消息和流进行编码和解码,我通常使用java.nio.ByteBuffer

编码并发送 ASCII 7 java.lang.String:

import java.nio.ByteBuffer;

public final class SerializerHelper {

   public static void putString( String s, ByteBuffer target ) {
      final byte[] bytes = s.getBytes();
      target.putInt( bytes.length );
      target.put( bytes );
   }

   public static void putBoolean( boolean value, ByteBuffer target ) {
      target.put((byte)( value ? 1 : 0 ));
   }

   public static boolean getBoolean( ByteBuffer source ) {
      return source.get() != 0;
   }

   public static String getString( ByteBuffer source ) {
      final int len = source.getInt();
      final byte[] bytes = new byte[len];
      source.get( bytes );
      return new String( bytes );
   }
}

在C:

uint32_t len       = strlen( s );
uint32_t lenForNet = htonl( len );
char * p = buffer;
memmove( p, &lenForNet, sizeof( lenForNet ));
p += sizeof( lenForNet );
memmove( p, s, len );
send( sckt, buffer, len + sizeof( LenForNet ), 0 );

答案 1 :(得分:0)

Java中的字符串是16位。如果要将字符串发送到C,请先转换为utf-8。 (或者使用16位字符串库,但通常你会转换为utf8)。

答案 2 :(得分:0)

我解决了这个问题。搜索并查看stackoverflow后,我按照此链接的答案。 Here

我做了:

Buffer[nread] = '\0';
printf("%s",Buffer);

答案 3 :(得分:0)

从套接字

接收
char recv_data;
 while ((bytes_received = recv(connected,&recv_data,1,0)) > 0){
        printf("\nrecv= %c\n", recv_data);
        }

从Java发送

 String datatosend = "5000";
   char[] strArray;
   strArray = datatosend.toCharArray();

   while (true) {
   for( int index = 0; index < strArray.length; index++){
       out.write(strArray[index]);
   }
out.flush();