[英]C union of integer to bytes read by Java and reconverted to Java int
我想使用C在串行線上發送一個編碼為字節數組的整數,並使用java接收它,然后將該數組放回java int。
我正在使用rs-232在由C聯合包裝的字節數組中發送四個字節。 (略微奇怪的typedef是由Arduino C語言引起的)在這里,例如,我發送十進制值600,它相應地打包為一個類型:
typedef union {
uint16_t integer;
byte binary[4];
} binaryInteger;
並使用以下功能發送:
void mcProxySend(binaryInteger bi){
for (byte i = 0; i < 4 ; i ++) {
mcProxySend(bi.binary[i]);
}
}
mcProxySend只是帶有偶爾轉義符的串行寫入。
我已經制定了Java類的接收端。 數據在流動,一點一點地,它和我發送的一樣。
我的問題是如何重組分解后的整數。
由於我在撰寫此問題的同時找到了答案,因此我將發布解決方案。
dec 6000的值是bin 1011101110000,並通過聯合將其拆分為
b[0] = 0 //(MSB)
b[1] = 0
b[2] = 10111
b[3] = 1110000 //(LSB)
與該線程中的答案類似,解決方案是將二進制值移位到新的整數。 假設它們具有相同的位長,這將重新創建原始字節結構。
您應該在接收方使用相同的並集(考慮可能的字節順序交換),然后將接收字節寫入b
字段,一旦所有四個都從integer
字段中提取出結果值。
哦,接收者是Java-沒關系!
假定字節序為大端,Java在java.io.Bits.getInt(byteArray,offset)中具有一個函數。 遺憾的是它沒有被宣布為公開。 但是它的實現很容易用於學習。
這是它的實現,它只是將每個字節提升為一個int,將其滑動到正確的位置,然后將這些值按位累加在一起。
static int getInt(byte[] b, int off) {
return ((b[off + 3] & 0xFF) ) +
((b[off + 2] & 0xFF) << 8) +
((b[off + 1] & 0xFF) << 16) +
((b[off ] ) << 24);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.