c++整型到Java整型的转换错误

Incorrect conversion from C++ integer to Java integer

本文关键字:整型 转换 错误 Java c++      更新时间:2023-10-16

我在将c++整型转换为Java整型时遇到问题。

在c++:

//while loop
int *bla = new int; *bla = counter; //counter starting from 0
counter++;
if ((size = send(client, bla, 4, 0)) == -1) //sizeof(int) show 4 bytes so I put it there directly
{
       cerr << "Error." << endl;
       return -1;
}
Java:

//while loop
//DataInputStream inFromServer;
System.out.println(inFromServer.readInt()); //it should read 4 bytes and interpret it as int

Result from Java:

0        //for 0
16777216 //for 1
33554432 //for 2
50331648 //etc.
67108864
83886080
100663296
117440512
134217728
150994944
167772160
184549376
201326592
218103808
234881024
251658240

(我使用g++)

编辑:两者(java和c++应用程序)运行在相同的树莓派与Raspian操作系统(所以它是本地主机)

似乎您遇到了客户机和服务器机器之间的端序差异(假设您在一台机器上运行c++而在另一台机器上运行java)。Endianness决定了cpu读取字节的顺序。例如,如果您有数字1,它可以作为一个32位整数(4字节)存储为0x 00 00 00 01(大端序)或0x 01 00 00 00(小端序)。这就解释了为什么值1得到16777216,即0x01000000 == 16777216。问题是不同的硬件不同意单一的端序有很多原因。

为了处理网络上的端序(或可能在其他情况下),通常在发送端从主机端序转换为网络端序(这是商定的),然后在接收端从网络端序转换为主机端序。

您提供的代码可能存在其他问题,但这似乎就是为什么您的数字显示为它们在服务器上所做的。


编辑

你在编辑中提到你们在同一台机器上运行。Endianness可能仍然是个问题;您可能只做了主机和网络端序之间转换的一面,尽管乍一看并不像这样。我不熟悉java,但是看一下文档,我没有看到任何提到它是否自动转换所读取的内容。

您得到的结果是:

0x01000000
0x02000000
0x03000000

等。

我想知道这是否是一个大端序和小端序的问题....你能试着在计数器中发送一个已知的值,这样我们就可以验证了吗?例如,如果您发送1144201745 (=0x44332211)并收到287454020 (=0x11223344),这将是一个很好的测试。