2012-06-24 67 views
3

所以通常我使用Netty,它是BigEndianHeapChannelBuffer,用Java來接收未加密的short(來自C++軟件)。 當我這樣做是這樣的:如何在java中存儲unsigned short?

buf.readUnsignedByte(); buf.readUnsignedByte();

返回: 149 and 00。直到現在一切都很好。因爲服務器發送149作爲無符號短[2字節]。

取而代之的是,我想(重新啓動我的申請後OFC)接收無符號短:

buf.readUnsignedShort();

和奇蹟發生。它返回:38144

下一步是檢索無符號字節: short type = buf.readUnsignedByte(); System.out.println(type);

並將其返回:1這是正確的輸出。

任何人都可以幫助我嗎? 我看着更深,這就是網狀做它:

public short readShort() { 
    checkReadableBytes(2); 
    short v = getShort(readerIndex); 
    readerIndex += 2; 
    return v; 
} 

public int readUnsignedShort() { 
    return readShort() & 0xFFFF; 
} 

但我仍想不出什麼是錯的。我希望能夠讀懂那149.

+0

顯然,終結是問題。序列149-0是* little * -endian:第一個字節是小字節。 –

+1

沒什麼魔法,149 * 256 + 0 = 38144。你已經指定了BigEndian,所以這看起來是正確的,最重要的字節首先被髮送。 –

+0

您可能的意思是「無符號短[2個字節]」 – Ixx

回答

0

答案是改變字節順序。感謝羅傑在評論中寫道:

沒什麼魔法,149 * 256 + 0 = 38144。您指定大尾端所以這似乎是正確的,最顯著字節首先發送

和:

@mickula短是兩個字節,其中一個字節是「身價」 256倍另一方面,因爲你使用BigEndian,第一個字節是一個「值得」更多。類似於數字1,2和3的十進制數123.第一個位置是下一個位置的10倍,其值是下一個位置的10倍,依此類推。所以1 * 100 + 2 * 10 + 3 = 123當數字一次傳輸一個。如果你看到1,2和3是小端,你可以使用1 + 2 * 10 + 3 * 100 = 321. 256是因爲一個字節的大小是256. -

感謝他的評論我只是在服務器引導切換字節順序加入:
bootstrap.setOption("child.bufferFactory", new HeapChannelBufferFactory(ByteOrder.LITTLE_ENDIAN));

1

你也可以從Java DataInputStream借用的頁面。 readUnsignedShort()執行:

public final int readUnsignedShort() throws IOException { 
    int ch1 = in.read(); 
    int ch2 = in.read(); 
    if ((ch1 | ch2) < 0) 
     throw new EOFException(); 
    return (ch1 << 8) + (ch2 << 0); 
}