2015-04-15 20 views
6

我知道可以從int提取字節這樣的:級聯字節到整數或短保留符號

bytes[] IntToBytes(int i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

我隨後發送作爲串行傳輸的一部分。但是,在接收到一系列字節後,我可以做相反的事情,重建原始數據,保存符號。目前,我這樣做,但它感覺有點過頂:

int BytesToInt(byte hi, byte lo) 
{ 
    return ((hi << 24) | (lo << 16)) >> 16; 
} 

有沒有另一種方法或更好的方法?如果我知道我最終只處理簽名的16位數據,它會有所作爲嗎?

+1

這是回答您的問題嗎? http://stackoverflow.com/questions/2538390/convert-16-bit-signed-int-to-2-bytes –

+0

@josh BitConverter看起來很理想,但需要通過endian測試。 – Graham

+0

'(int)BitConverter.ToInt16(new [] {lo,hi},0);' – Sinatr

回答

2

您正在使用帶符號的16位數據。那麼爲什麼你通過(並返回)int而不是short?你把標誌信息扔掉了,所以它實際上並不適用於負數。相反,使用short,你會沒事的 - 額外的類型信息會使你的代碼更安全。

byte[] ShortToBytes(short i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

short BytesToShort(byte hi, byte lo) 
{ 
    return unchecked((short)((hi << 8) | lo)); 
} 

主要好處(除了更清澈,實際上工作)是你不能再通過一個無效的價值的方法。這總是很好:)

哦,我建議保持界面對稱 - BytesToShort也應採取byte[](或其他一些具有兩個字節的結構)。

+0

這會導致負數溢出 – Graham

+0

不,它不會。我測試了它的負數,以及一組隨機數。你是否可以改變'hi'和'lo'?對'ShortToBytes'和'BytesToShort'的返回值使用'byte []'的另一個原因:) – Luaan

+0

有趣。任何對'BytesToShort'的調用都會溢出,其中hi> 127的值。可能與Checked/Unchecked設置有所不同 – Graham