Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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/2/facebook/8.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
Java 用于发送段的C BinaryWriter缓冲区?_Java_C#_Input_Output_Binarywriter - Fatal编程技术网

Java 用于发送段的C BinaryWriter缓冲区?

Java 用于发送段的C BinaryWriter缓冲区?,java,c#,input,output,binarywriter,Java,C#,Input,Output,Binarywriter,我不确定我要找的是不是缓冲区,所以我会向你们展示我的问题,然后你们可以决定这是否是正确的词和解决方案。目前,我正在为C中的Java DataOutputStream类创建一个网络端口。我要做的最后一件事是通过发送分段信息来解决这个问题 这是我在C ClientOutput中的WriteInt方法,它是BinaryWriter的一个实例 对于任何想要比较的人;这是Java的原始版本 通常在java中,在将数据发送到服务器或客户端之前,必须调用Flush;但是,无论何时调用Write,BinaryW

我不确定我要找的是不是缓冲区,所以我会向你们展示我的问题,然后你们可以决定这是否是正确的词和解决方案。目前,我正在为C中的Java DataOutputStream类创建一个网络端口。我要做的最后一件事是通过发送分段信息来解决这个问题

这是我在C ClientOutput中的WriteInt方法,它是BinaryWriter的一个实例

对于任何想要比较的人;这是Java的原始版本

通常在java中,在将数据发送到服务器或客户端之前,必须调用Flush;但是,无论何时调用Write,BinaryWriter都会自动刷新

下面是Java中的ReadInt代码

public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
示例outputJava:

输出的时间应为:

1000

请容忍我,因为我几天前刚学了C,我可能在问一个愚蠢的问题

BinaryWriter有一系列写入方法重载,看起来您正在调用WriteInt32重载,它当然会发送四个4字节整数

您应该能够通过在调用Write时将值强制转换为byte来解决问题:

public void WriteInt(int v)
{
    ClientOutput.Write ((byte)(((uint)v >> 24) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 16) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 8) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 0) & 0xFF));
    IncCount (4);
}
请注意,从技术上讲,您不需要在移位之前将值v转换为uint。即使要进行符号扩展,也要屏蔽除最后一个字节以外的所有字节。但那部分不应该伤害任何东西


查看Jon Skeet的endian感知版本的BinaryWriter。这里有讨论和一些链接:

我向uint强制转换的唯一原因是,用java编写的原始库使用了无符号移位。我想这是有原因的,所以我保留了他们的方法。我一到家就试试这个,看看是否管用。非常管用,谢谢!
Client.WriteInt(1000);
0
0
50331648
-402653184
1000
public void WriteInt(int v)
{
    ClientOutput.Write ((byte)(((uint)v >> 24) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 16) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 8) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 0) & 0xFF));
    IncCount (4);
}