簡體   English   中英

C整數與Java讀取的字節的並集,並轉換為Java int

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM