簡體   English   中英

從C ++整數到Java整數的錯誤轉換

[英]Incorrect conversion from C++ integer to Java integer

我將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 OS的同一Raspberry Pi上運行(因此它是localhost)

看來您在客戶端計算機和服務器計算機之間遇到了字節序差異(假設您在一個計算機上運行c ++,在另一個計算機上運行java)。 字節序確定CPU讀取字節的順序。 例如,如果您有數字1,則可以將其存儲為32位整數(4個字節),其存儲方式為0x 00 00 00 01 (大字節序)或0x 01 00 00 00 (小字節序)。 這就解釋了為什么要獲得16777216的值1,因為0x01000000 == 16777216 問題在於由於多種原因 ,不同的硬件不能在一個字節序上達成一致。

為了處理網絡上的字節序(或在其他情況下也可能),通常在發送方上將主機字節序轉換為網絡字節序(已商定),然后在接收方將其從網絡字節序轉換為主機字節序

您提供的代碼還有其他可能的問題,但這似乎就是為什么您的數字像在服務器上一樣出現的原因。


編輯

您在編輯中提到您正在同一台計算機上運行。 字節序可能仍然是問題。 盡管乍一看看起來並不像主機與網絡字節序之間的轉換,但您可能只在其中進行了轉換。 我對Java不熟悉,但是在文檔中我看不到它是否自動轉換讀取的內容。

您得到的結果是:

0x01000000
0x02000000
0x03000000

等等

我不知道這是大端還是小端的問題。...您可以嘗試在計數器中發送已知值,以便我們進行驗證嗎? 例如,如果您發送1144201745(= 0x44332211)並獲得287454020(= 0x11223344),那將是一個很好的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM