我将C ++整数转换为Java int有问题。
在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
来自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操作系统上运行相同的Raspberry Pi(所以它是localhost)答案 0 :(得分:3)
您的客户端和服务器计算机之间似乎存在endianness差异(假设您正在运行c ++而另一个运行java)。 Endianness确定cpu读取字节的顺序。例如,如果您具有数字1,则可以将其存储为32位整数(4个字节),作为0x 00 00 00 01
(大端)或0x 01 00 00 00
(小端)。这就解释了为什么你得到值为1的16777216为0x01000000 == 16777216
。问题是不同的硬件对numerous reasons的单个字节序不一致。
为了处理网络上的字节顺序(或者也可能在其他情况下),通常convert from host endianness to network endianness (which is agreed upon) on the sender, then from network endianness to host endianness on the receiver。
您提供的代码还有其他可能的问题,但这似乎是您的号码与服务器上的数据一致的原因。
您在编辑中提到您在同一台计算机上运行。字节序仍然是问题;您可能只在主机和网络字节序之间进行转换的一方,尽管乍一看它看起来并不像。我不熟悉java,但looking at the documentation如果它自动转换所读内容,我就不会看到任何提及。
答案 1 :(得分:2)
您获得的结果是:
0x01000000
0x02000000
0x03000000
等
我想知道这是一个大端还是小端问题....你能尝试在柜台发送一个已知值,以便我们验证这个吗?例如,如果您发送1144201745(= 0x44332211)并获得287454020(= 0x11223344),那将是一个很好的测试。