小弟用java客户端向c服务器转发数据  有的数据类型不会转  Octet String(定长字符串),Unit16_t(16 位无符号整型),Unit32_t(32 位无符号整型)  这些怎么对应java里的数据类型  ,该怎么转  ,求帮助  ,最好有例子 ,谢谢

解决方案 »

  1.   

    不是用socket吗?用了socket都是byte流,两边都一样。
      

  2.   


    Octet String(定长字符串):byte[] b = new byte[n] ,n 代表定长的长度最后添加‘\n’结束字符Unit16_t(16 位无符号整型):intUnit32_t(32 位无符号整型):int 
      

  3.   

    比如要发送8字节的 Octet_string  内容是hkkpssy ,和4字节的Unint32_t 内容是10080001  该怎么发
      

  4.   


    String str="hkkpssy";
    int x=0x10080001;
    byte bt[]=new byte[8];
    Arrays.fill(bt, (byte)'\n');
    System.arraycopy(bt,0,str.getBytes(),0,str.length());
    BufferedOutputStream out=new BufferedOutputStream(socket.getOutputStream());
    out.write(bt,0,bt.length);
    out.write(x);
    out.flush();
      

  5.   

    上面写得有些问题,改一下String str="hkkpssy";
    int x=0x10080001;
    byte bt[]=new byte[8];
    Arrays.fill(bt, (byte)0);
    byte s[]=str.getBytes();
    System.arraycopy(bt,0,s,0,s.length);
    BufferedOutputStream out=new BufferedOutputStream(socket.getOutputStream());
    out.write(bt,0,bt.length);
    out.write(x);
    out.flush();
      

  6.   

    转的时候,比原来的大一级就行了。譬如byte-》int,int-》long
      

  7.   

    就是这样。byte用short就可以。
    说的详细点,比如c端是无符号byte,那么你只要定义short a = 220;然后写到协议数组的时候byte(a)强行转换。
    如果你还要从c端读取,那么也要用short来接收:short a = mybyte;否则如果数据超过127,你java端读取的时候就会显示负数了.
      

  8.   

    转发 是什么意思?客户端->代理->服务器端 
    这样的转发吗? Java做代理? 如果是这种,读到啥就转啥就行了,什么也不用做,除非你要解析数据。
      

  9.   

    轉成byte資料,c就會認為是16進位了
      

  10.   

    我给几个工具方法,你自己看看,只是这里的输入流,我已经读取到应用层的缓冲区了    public static final int  INT8_MASK  = 0xFF;
        public static final int int8(ByteBuffer buf) {
            return buf.get();
        }
        public static final int uint8(ByteBuffer buf) {
            return buf.get() & INT8_MASK;
        }
        // 这个类似你说的定长的
        public static final String string(ByteBuffer buf, int length) {
            byte[] bs = new byte[length];
            buf.get(bs);
            return new String(bs);
        }
        // 这个是小端的byte数组转整型
        public static int byte2Int(byte[] src) {
            int ret = 0;
            for (int i = src.length - 1; i >= 0; i--) {
                ret = (ret << 8) | (src[i] & 0xFF);
            }
            return ret;
        }
      

  11.   

    C语言服务端接收数据并打印,考虑到C语言struct对齐问题,数据顺序是string, u_int32_t, u_int16_t,部分代码如下:void handle_req(int fd) {
    struct {
    char data_str[8];
    u_int32_t data_int32;
    u_int16_t data_int16;
    } data;

    if(readn_timeout(fd, (void *)&(data), sizeof(data), 30) < 0) {
    printf("readn_timeout() failed");
    return;
    }
    printf("Data_1:[%s], Data_2:[%d], Data_3:[%d]\n",
    data.data_str, data.data_int32, data.data_int16); return;
    }
    JAVA客户端发送数据,代码如下:package com.test.exp;import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;public class TestClient { private static ByteBuffer getDataBuffer() {
    ByteBuffer dataInfo = ByteBuffer.allocate(16);
    dataInfo.order(ByteOrder.nativeOrder());

    String data_1 = "hkkpssy";
    int data_2 = 333;
    short data_3 = 111;

    byte[] data_1_bytes = data_1.getBytes();
    int i = 0;
    for(; i < Math.min(8, data_1_bytes.length); i++){
    dataInfo.put(data_1_bytes[i]);
    }
    for(; i < 8; i++){
    dataInfo.put((byte)0);
    }

    dataInfo.putInt((int)data_2);
    dataInfo.putShort((short)data_3);

    dataInfo.rewind();
    return dataInfo;
    }

    public static void main(String[] args) {
    String serverIP = "192.168.233.34";
    int serverPort = 50000;

    try {
    Socket theSocket = new Socket(serverIP , serverPort);
    OutputStream out = theSocket.getOutputStream();

    byte[] data = getDataBuffer().array();
    System.out.println(data.length);
    out.write(data);
    theSocket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }