Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C服务器到Java客户端套接字读取传递的短值_Java_C_Sockets_Network Programming_Unsigned - Fatal编程技术网

C服务器到Java客户端套接字读取传递的短值

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

我很难从C服务器传递一个短值。我在另一端收到的是看起来像“垃圾”的东西,我似乎无法将它转换成有用的东西

我认为影响它的因素有很多

  • 2s补码
  • 潜在ASCII或UTF-8编码
  • 从C代码开始:

            // 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):

    问题:

  • 如何正确读取套接字
  • 如何正确读取10位?(我已尝试使用0x3FF屏蔽字符)
  • 2的补码是否可能导致问题
  • 谢谢,

  • 您正在接收二进制文件,因此根本不应该使用
    读取器。您应该使用
    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