Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
将uintN数据类型从C转换为Java(套接字编程)_Java_C_Sockets_Unsigned Integer - Fatal编程技术网

将uintN数据类型从C转换为Java(套接字编程)

将uintN数据类型从C转换为Java(套接字编程),java,c,sockets,unsigned-integer,Java,C,Sockets,Unsigned Integer,我需要通过套接字(即winsock接口)从用C编写的本机程序发送数据。然后由java程序接收该数据。Java程序接收一个数据包,它知道该数据包的顺序并进行一些处理。它接受从socket.Read()接收的int,就像client\u socket.getInputStream().Read() 解析从Read()返回的int数据的处理,以获得预期的数据类型。基本上,它是对接收到的批量数据进行切片。我只能假设read()函数一次读取4个字节(32位java int大小)。因此,我继续将这4个字节(

我需要通过套接字(即winsock接口)从用C编写的本机程序发送数据。然后由java程序接收该数据。Java程序接收一个数据包,它知道该数据包的顺序并进行一些处理。它接受从socket.Read()接收的int,就像
client\u socket.getInputStream().Read()

解析从Read()返回的int数据的处理,以获得预期的数据类型。基本上,它是对接收到的批量数据进行切片。我只能假设read()函数一次读取4个字节(32位java int大小)。因此,我继续将这4个字节(8位不是Java类型)分成4个Java短片,这样我就可以正确地表示它们所表示的无符号值。 在我有了4条短裤之后,如果我知道我想要一条uint16,我就把这2条短裤连接起来

问题是我在某个地方做了一些错误的位操作,但并不像我想象的那样有效。 下面是C代码和Java代码,虽然不起作用,但非常简单。输出是我不明白为什么它是这样的

0 0   0 0    0 1     0 0     0 2     0 0     0 3     0 0     0 4 {...}
C代码编辑了初始化部分:

uint16_t buffer[255] = {};
uint16_t *current_pointer = buffer;
for(uint16_t index = 0; index < 255; index++) {
    *current_pointer = index;
    current_pointer++;
}
Write(client_socket, (char *)buffer, sizeof(buffer));
uint16\u t缓冲区[255]={};
uint16_t*当前_指针=缓冲区;
对于(uint16_t index=0;index<255;index++){
*当前_指针=索引;
当前_指针++;
}
写入(客户端套接字,(字符*)缓冲区,大小(缓冲区));
java代码还修订了:

public final short[] JavaIntToUint8Array(int unsigned_int) {
    return new short[] { (short)((unsigned_int & 0xFF000000L) >> 24),
                (short)((unsigned_int & 0x00FF0000L) >> 16),
                (short)((unsigned_int & 0x0000FF00L) >> 8),
                (short)((unsigned_int & 0x000000FFL))};
}
public final int[] JavaIntToUint16(int unsigned_int) {
    short uint8_array[] = JavaIntToUint8Array(unsigned_int);
    return new int[] { (int)(uint8_array[0] << 8) | (int)uint8_array[1],            
        (int)(uint8_array[2] << 8) | (int)(uint8_array[3]) };
}
public final short[]JavaIntToUint8Array(int unsigned_int){
返回新的short[]{(short)((unsigned_int&0xFF000000L)>>24),
(短)((未签名的_int&0x00FF0000L)>>16),
(短)((无符号输入&0x0000FF00L)>>8),
(短)((unsigned_int&0x000000FFL))};
}
公共最终整数[]JavaIntToUint16(整数未签名){
短uint8_数组[]=JavaIntToUint8Array(unsigned_int);
返回新的int[]{(int)(uint8_数组[0]
我只能假设read()函数一次读取4个字节
(32位java int大小)

不,你不能这样假设。上面说:

公共摘要int read() 抛出IOException

从输入流读取数据的下一个字节。值字节作为0到255范围内的整数返回。如果没有可用的字节 由于已到达流的末尾,因此值-1为 返回。此方法将一直阻止,直到输入数据可用为止 检测到流,或引发异常

A subclass must provide an implementation of this method.

Returns:
    the next byte of data, or -1 if the end of the stream is reached.

读取无符号短数字的最简单方法是使用DataInput.readUnsignedShort()

这使用big-endian或network-endian。如果您使用little-endian(例如,在x86/x64处理器上),您可以自己更改字节顺序,也可以使用ByteBuffer进行更改

// using NIO
SocketChannel sc = SocketChannel.open(new InetSocketAddress("localhost", 12345));
ByteBuffer bb = ByteBuffer.allocateDirect(32*1024).order(ByteBuffer.LITTE_ENDIAN));
while(sc.read(bb) >= 0) {
    bb.flip();
    while(bb.remaining() > 1) {
       int num = bb.getShort() & 0xFFFF;
    }
    bb.compact();
}

您真的需要发送一个无符号短值流吗?更常用的流是一个无符号字节,它们更简单。

sc.read(bb)>0不应该是sc.read(bb)>=0吗?read可能返回0。如果阻塞,则返回0,但无论如何都会更改它。;)java太棒了。我可以改变缓冲区本身的endiannes。还有很多关于缓冲区库的事情我不知道。流包含多种数据类型。我希望有一些顺序和“解析”相应的类型。你可以得到short,int,float,double,char和bytes。这意味着我看到的4个数字实际上就是字节本身。如果是这样的话,那太简单了,我感觉很糟糕
DataInputStream dis = new DataInputStream(data_input);
int num = dis.readUnsignedShort();
// using NIO
SocketChannel sc = SocketChannel.open(new InetSocketAddress("localhost", 12345));
ByteBuffer bb = ByteBuffer.allocateDirect(32*1024).order(ByteBuffer.LITTE_ENDIAN));
while(sc.read(bb) >= 0) {
    bb.flip();
    while(bb.remaining() > 1) {
       int num = bb.getShort() & 0xFFFF;
    }
    bb.compact();
}