如何在C++中解析数据

How to parse data in C++

本文关键字:数据 C++      更新时间:2023-10-16
  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);

我正在发送这样的字节数据,我想在我的linux服务器上使用c++解析它

在c++中,我正在阅读

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

并将updatea推送到pthread的队列中。我想我必须读取第一个字节来查看数据包的类型,然后读取下一个8字节来获取设备id,以此类推。。请给我一些参考资料或教程,以便在c++代码中做到这一点。。

提前谢谢。。

下面的代码将有效地完成任务。我假设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] = '';

注意:我在掩饰一些东西,即

  • BUF_SIZE过小时不处理
  • 不处理的时候C程序机是不小的ENDIAN。如果是big-endian,则需要将device_idname_lenmemcpy之后的字节切换
  • 不在memcpy调用上键入强制转换以避免可能的编译器警告

这个解决方案是纯C,也可以在C++中工作。

如果您可以控制Java代码,并且没有必须实现的标准网络协议,那么我建议您使用不同的方法。您可以使用更高级别的序列化库,如Google协议缓冲区,而不是将字节推送到如此低的级别。这里既有C++教程,也有Java教程,它们应该会让您入门。

使用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] = '';
}

再一次,我没有错误地检查istream::read调用、担心endian问题或放入类型强制转换。尽量保持简单。