[英]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.