C服务器到Java客户端套接字读取传递的短值
我很难从C服务器传递一个短值。我在另一端收到的是看起来像“垃圾”的东西,我似乎无法将它转换成有用的东西 我认为影响它的因素有很多C服务器到Java客户端套接字读取传递的短值,java,c,sockets,network-programming,unsigned,Java,C,Sockets,Network Programming,Unsigned,我很难从C服务器传递一个短值。我在另一端收到的是看起来像“垃圾”的东西,我似乎无法将它转换成有用的东西 我认为影响它的因素有很多 2s补码 潜在ASCII或UTF-8编码 从C代码开始: // Read 10 bit value into short unsigned short ret = decideActionCall(buffer); unsigned char lsb = (unsigned char) ret; un
// Read 10 bit value into short
unsigned short ret = decideActionCall(buffer);
unsigned char lsb = (unsigned char) ret;
unsigned char msb = (unsigned char) (ret >> 8);
printf("msb,lsb = %02x,%02x\n",msb, lsb);
/**
char retString [4];
retString[0] = msb;
retString[1] = lsb;
retString[2] = '\n';
retString[3] = '\0';
*/
unsigned short retString1[1];
retString1[0] = ret;
printf("msb,lsb = %d,%d\n",retString[0],retString[1]);
printf("String to send: <%s>\n",retString1);
//if (write(newsockfd, retString, 3) < 0) {
// error("Error sending response to the server");
//}
if (write(newsockfd, &retString1, 2) < 0) {
error("Error sending response to the server");
}
if (write(newsockfd, "\r",1) < 0) {
error("Error sending response to the server");
}
Java示例输出(android logcat):
问题:
读取器。您应该使用DataInputStream.readShort()。
如果需要16位整数,请不要使用“short”,因为short的大小是由实现定义的。改用“uint16_t”-它被定义为16位。您还需要按照网络顺序读取和写入多字节整数。还可以尝试用十六进制打印Java输出。谢谢您的回复。在可用的情况下,我将值更改为uint16\u t和unint8\u t。我还使用1s和0s给出的链接将其更改为网络字节顺序。我也打印了十六进制,但还是乱七八糟的。我实现了EJP建议的更改,它似乎已经工作了。此外,考虑使用类似协议缓冲区的东西,而不是手动推送二进制数据。谢谢您的响应。我实施了这一改变,我相信这是解决办法。我始终获得发送过来的正确值。
START-----------------------------
0 0
136 0x88
ADC3 = 136
END-----------------------------
decideActionCall() ret value: 136
msb,lsb = 00,88
msb,lsb = 0,136
String to send: <�>
BufferedReader bufIn = new BufferedReader(new InputStreamReader(in));
String response = bufIn.readLine();
char [] hello = response.toCharArray();
for (char a : hello) {
short shortA = (short) (a & 0x3FF);
System.out.println(a + " = " + (int)a + " = " + shortA);
//System.out.println((int)a);
//System.out.println(Integer.valueOf(a+"",10));
}
byte test[] = response.getBytes("UTF-8");
StringBuilder sb = new StringBuilder();
for (byte b : test) {
sb.append(String.format("%02X ", b));
}
System.out.println(sb.toString());
byte b05 = 0x00;
byte b06 = 0x00; // MSB, positive as < 0x80
int i = 0;
for (byte a : test) {
//System.out.println(short1);
System.out.println("byte: " + a);
//System.out.println(Integer.valueOf(a+"",10));
if (i == 0 ) {
b05 = a;
} else {
b06 = a;
}
i++;
}
System.out.println("i = " + i);
byte[] byteTabDay = new byte[2];
byteTabDay[0] = b05;
byteTabDay[1] = b06;
BigInteger temp = new BigInteger(test);
System.out.println(temp);
System.out.println(temp.intValue());
System.out.println(temp.shortValue() + 65536);
BigInteger temp2 = new BigInteger(byteTabDay);
System.out.println(temp2);
System.out.println(temp2.shortValue() + 65536);
I/System.out﹕ response: ���
I/System.out﹕ here: � 65533
I/System.out﹕ ascii: 65485 65581
I/System.out﹕ � = 65533 = 1021
I/System.out﹕ �� = 0 = 0
I/System.out﹕ EF BF BD 00
I/System.out﹕ byte: -17
I/System.out﹕ byte: -65
I/System.out﹕ byte: -67
I/System.out﹕ byte: 0
I/System.out﹕ i = 4
I/System.out﹕ -272646912
I/System.out﹕ -272646912
I/System.out﹕ 48384
I/System.out﹕ -4352
I/System.out﹕ 61184