我正在尝试将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上接收的字节数?如果有人能向我解释,我将非常感激!
答案 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)
答案 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();