Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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之间的输出差异_C#_Java - Fatal编程技术网

C#和java之间的输出差异

C#和java之间的输出差异,c#,java,C#,Java,我正在尝试为C#中的函数编写Java等价物。代码如下 在C#中: 在Java中: InputStream fstream = new FileInputStream(fileName); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); byte[] a = new byte[4]; readBytes(in,

我正在尝试为C#中的函数编写Java等价物。代码如下

在C#中:

在Java中:

InputStream fstream = new FileInputStream(fileName);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
byte[] a = new byte[4];
readBytes(in, a, 0, 4);
int answer = byteArrayToInt(a);
Java和C#:

两者之间有一个区别,我从一个文件输入流中读取数据,该数据流经过编码并解析前四个字节。C#代码似乎产生了192个正确答案,而Java产生了-1073741824个错误答案。为什么和如何

编辑

这是我的byteArrayToInt

public static int byteArrayToInt(byte[] b, int offset) {
        int value = 0;
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (b[i + offset] & 0x000000FF) << shift;
        }
        return value;
    }
public static int byteArrayToInt(字节[]b,int偏移量){
int值=0;
对于(int i=0;i<4;i++){
整数移位=(4-1-i)*8;

java字节中的值+=(b[i+offset]&0x000000FF)是有符号的,因此java字节中的-64是二进制的,相当于c字节中的192(192==256-64)

问题可能出在
byteArrayToInt()
中,您假设它在转换过程中未签名

简单的

 `b & 0x000000FF`

在这种情况下可能会有所帮助。

中的java字节是有符号的,因此您的java字节中的-64是二进制的,相当于c字节中的192(192==256-64)

问题可能出在
byteArrayToInt()
中,您假设它在转换过程中未签名

简单的

 `b & 0x000000FF`

在这种情况下可能会有所帮助。

Java的byte对象按soulcheck编写的方式进行签名。无符号8位整数上192的二进制值应为
11000000


如果您以有符号格式读取此值,前导1将表示负数。这意味着
11000000
将变为
负01000000
,即-64。

Java的byte对象以soulcheck写入的方式进行签名。无符号8位整数上192的二进制值将为
11000000


如果您以带符号的格式读取此值,前导1将表示负数。这意味着
11000000
将变为
负数01000000
,即-64。

我已编辑以包含我的byteArrayToInt-这是否正确?我是什么missing@Vrashabh您没有遗漏任何内容。对于字节数组
{0,0,0,-64}
offset==0
抱歉再次编辑。以下是我的输出。C#:位转换前a={192,0,0,0}和转换后a=192 Java:位转换前a={-64,0,0,0}和a=-1073741824感谢您让我走上正确的轨道。更改了我的byteArrayToInt(请参阅编辑)我编辑了我的byteArrayToInt-是这样吗?我是什么missing@Vrashabh您没有遗漏任何内容。它返回字节数组
{0,0,0,-64}
偏移量==0
192
,抱歉,这是我的输出。C#:位转换前a={192,0,0,0}转换后a=192 Java:位转换前a={-64,0,0,0}和转换后a=-1073741824感谢您让我走上正轨。更改了我的byteArrayToInt(请参见编辑)
public static int byteArrayToInt(byte[] b, int offset) {
        int value = 0;
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (b[i + offset] & 0x000000FF) << shift;
        }
        return value;
    }
public static int byteArrayToInt(byte[] b) 
    {
        long value = 0;
        for (int i = 0; i < b.length; i++)
        {
           value += (b[i] & 0xff) << (8 * i);
        }
        return (int) value;
    }
 `b & 0x000000FF`