2011-06-17 75 views
0
final byte LOGIN_REQUEST = 1; 
    long deviceId = 123456789; 
    String nickname = "testid"; 

    Socket mSocket = new Socket("localhost", 12021); 
    ByteBuffer bBuffer = ByteBuffer.allocate(1); 
    bBuffer.order(ByteOrder.LITTLE_ENDIAN); 

    //1 
    bBuffer.put(LOGIN_REQUEST); 

    //8 
    bBuffer.putLong(deviceId); 

    byte[] bString = nickname.getBytes(); 
    int sLength = bString.length; 

    //4 
    bBuffer.putInt(sLength); 
    bBuffer.put(bString); 

我送這樣的字節的數據,我想用C++如何在C++解析數據

在C++來解析它在我的Linux服務器上,我讀

char *pdata = new char[BUF_SIZE]; 
int dataLength = read(m_events[i].data.fd, pdata, BUF_SIZE); 

和推將pdata放入pthread的隊列中。我想我要讀第一個字節看包的類型和閱讀下一8字節來獲得設備ID等.. 請給我一些參考或教程做這在C++代碼..

在此先感謝..

回答

1

下面的代碼將有效地伎倆。我假設一個java int是32位

#include <inttypes.h> 

// Declare variables 
unsigned char login_req; 
int64_t  device_id; 
uint32_t  name_len; 
char*   name_str; 

// Populate variables; 
login_req = pdata[0]; 
memcpy(&device_id, pdata+1, 8); 
memcpy(&name_len, pdata+9, 4); 
name_str = (char*)malloc(name_len + 1); 
memcpy(name_str, pdata+13, name_len); 
name_str[name_len] = '\0'; 

注:我掩飾一些東西,即

  • 時BUF_SIZE是小
  • 不處理C程序的機器時不處理不是小小的ENDIAN。如果是大尾數,那麼你就需要字節切換memcpydevice_idname_len
  • 後並沒有強制類型轉換上的memcpy調用來避免可能的編譯器警告

該解決方案是純C,將工作在C++中也是如此

+0

感謝您的回答。我在網上查找,並使用fstream和iostream發現了一個代碼。這和使用memcpy一樣嗎?您能否提供任何使用這些fstream和iostream的教程或示例?提前致謝.. – user800799 2011-06-17 05:38:24

0

如果你能控制Java代碼,並且沒有必須實現的標準網絡協議,那麼我會推薦一種不同的方法。您可以使用更高級別的序列化庫,例如Google Protocol Buffers,而不是在這麼低的級別推送字節。有C++ tutorialsJava tutorials,這應該讓你開始。

0

使用iostream庫幾乎是一樣的,你可能已經使用基本讀取完成,無需在C的中間緩衝區寫即

#include <inttypes.h> 
#include <iostream> 

void readData(std::istream input) 
{ 
    // Declare variables 
    unsigned char login_req; 
    int64_t  device_id; 
    uint32_t  name_len; 
    char*   name_str; 

    // Populate variables; 
    input.read(&login_req, 1); 
    input.read(&device_id, 8); 
    input.read(&name_len, 4); 
    name_str = (char*)malloc(name_len + 1); 
    input.read(name_str, name_len); 
    name_str[name_len] = '\0'; 
} 

再次我不是錯誤的istream的檢查::閱讀調用,擔心endian問題,或投入類型轉換。試圖保持簡單。