我是從我的Android手機整數發送與下面的代碼的字節(我只放了塊需要):字節爲int類型轉換網絡應用
private byte[] intToByteArray (final int i) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(i);
dos.flush();
return bos.toByteArray();
}
//thread sender
data = new byte[16];
...
try {
temp = intToByteArray((int) (roll*100));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
data[3] = temp[0];
data[4] = temp[1];
data[5] = temp[2];
data[6] = temp[3];
...
p = new DatagramPacket(data, 16);
udpSocket.send(p);
發送代碼工作,因爲我已經嘗試過了收到Java後,結果是正確的。真正的接收器必須使用嵌入式設備Murata SN8200來實現:我收到數據包,但是我的整數結果(例如滾動)不正確。我使用從字節轉換爲int的代碼如下:
void getSubArray(char* dest, char* source, int start, int end){
uint8_t i, j = 0;
for(i=start; i<end; i++){
dest[j] = source[i];
j++;
}
}
int byteToInt(char* bytes)
{
int ch1 = bytes[0];
int ch2 = bytes[1];
int ch3 = bytes[2];
int ch4 = bytes[3];
if ((ch1 | ch2 | ch3 | ch4) < 0)
WPRINT_APP_INFO (("boh\r\n"));
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
...
//thread receiver
wiced_packet_get_data(packet, 0, (uint8_t**)&rx_data, &rx_data_length, &available_data_length);
traffic_type = rx_data[0];
id = rx_data[1];
takeOffPressed = rx_data[2];
getSubArray(temp, rx_data, 3, 7);
roll = byteToInt(temp);
WPRINT_APP_INFO (("Rx: \" Packet Type: %c Id: %c TakeOffPressed = %c \r\n roll: %d \r\n ", (unsigned char)traffic_type, (unsigned char)id, (unsigned char)takeOffPressed, roll);
閱讀其他討論我已經嘗試過的事情:卷=(INT *)(臨時);正如另一篇文章中的建議,但它不適用於我(別名編譯器錯誤)。任何想法來解決這個問題?感謝
手機發送整數是4個字節我想這確實是在大端接受它時,你必須將它轉換成你的本地字節序.. 。void void getSubArray爲什麼不使用memcpy? –
記得從網絡訂單轉換爲主機訂單。否則,你的字節*可能是錯誤的方式。 看看htonl和ntohl。 –
是的,請打印'hex'中的值,並檢查字節是否不相反,如果你只是需要將它們從endiannes轉換爲正確的。 –