【问题标题】:Incorrect conversion from C++ integer to Java integer从 C++ 整数到 Java 整数的错误转换
【发布时间】:2014-05-07 02:53:25
【问题描述】:

我在将 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

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 OS 的同一个 Raspberry Pi 上(所以它是 localhost)

【问题讨论】:

  • 你的 C++ 代码有问题。首先修复内存问题和发送检查
  • 如果它解决了您的问题,请不要忘记将答案标记为解决方案。此外,最好从一开始就寻找正在翻转数据的字节顺序以避免将来出现问题。
  • 刚刚遇到this link 指出DataInputStream 是大端ONLY(意味着它会在需要时自动转换数据),如果您的机器是小端(其中according to this Raspberry pi 是)。看到这个帖子就想到了。

标签: java c++ type-conversion


【解决方案1】:

您的客户端和服务器机器之间似乎遇到了endianness 的差异(假设您在一台机器上运行 c++ 而在另一台机器上运行 java)。字节序决定了 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 如果它自动转换读取的内容,我没有看到任何提及。

【讨论】:

    【解决方案2】:

    你得到的结果是:

    0x01000000
    0x02000000
    0x03000000
    

    等等

    我想知道这是否是一个大端与小端的问题....您可以尝试在计数器中发送一个已知值,以便我们验证这一点吗?例如,如果您发送 1144201745 (=0x44332211) 并获得 287454020 (=0x11223344),那将是一个很好的测试。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多