2

如何在Java中生成16位無符號整數和64位無符號整數?這個問題與實施標準有關。我無法改變規範。無符號16位和64位整數

規範的其他可能相關位。這個問題是關於:

  • 最顯著位必須爲0。
  • 必須在網絡字節順序來表示。

應用程序上下文:數字(以任一形式)表示正在發送的數據的長度。長度可以大或小。我已經第一次發現消息的長度要發送很長時間。

所以我開始:long length = getLength();

然後我需要把長變量「長度」轉換爲上述兩種,取決於它有多大。最後,我非常確定,當我發送長度時,我需要做一個.getBytes()。收件人將如上所述進行解釋。

+2

在Java中,「short」被強制爲16位,而「long」強制爲64位。它們是簽名類型,但是你指定msb將始終爲0,所以這應該不重要。這足夠嗎? –

+0

您是否想將它作爲二進制數據寫入流中,是什麼意思?將它保持爲「長度」是什麼問題? –

+0

是的。我必須將它寫入流中。我嘗試發送很長時間,但沒有奏效。收件人ch咽。當其他已經開發的發送者發送時,接收者看起來沒有問題。爲了清晰起見,我在問題中添加了一個句子。我無法改變規格。 –

回答

6

如果最高有效位必須爲零,那麼無論是有符號還是無符號(假設是二進制補碼錶示形式),數字都是相同的。因此,舉例來說,具有MSB零的16位整數表示從032767(含)的數字。

假設你正在寫一個OutputStream和你的「網絡秩序」的定義首先是最顯著字節,那麼你需要做這樣的事情:

public void writeShort(OutputStream os, short s) throws IOException { 
    os.write((byte) (s >> 8)); 
    os.write((byte) s); 
} 

public void writeLong(OutputStream os, long l) throws IOException { 
    os.write((byte) (l >> 56)); 
    os.write((byte) (l >> 48)); 
    os.write((byte) (l >> 40)); 
    os.write((byte) (l >> 32)); 
    os.write((byte) (l >> 24)); 
    os.write((byte) (l >> 16)); 
    os.write((byte) (l >> 8)); 
    os.write((byte) l); 
} 

請注意,這些適用於有符號和無符號整數。 (或者對於Java上下文更精確,如果參數代表是有符號或無符號整數,則它們工作。)

+0

非常感謝。我推廣併發回: –

+1

int shift = 8;對於(int i = 0; i >(shift *(n-1-i))) } –

+0

評論不會很好地格式化代碼。無論如何 - 它的工作。 –

0

Java沒有無符號的數據類型(在這裏看到:http://darksleep.com/player/JavaAndUnsignedTypes.html

INT有32位,長有64位,短期有16位

是如此糟糕來存儲所有一樣長?

+0

「Java沒有未簽名的數據類型」。是。我知道。這就是我面臨的問題。這是應用程序的一項要求。 –

+0

@Roger:但你說msb總是0,所以沒關係。 –

相關問題