如何在C++中解析数据
How to parse data in C++
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_id
和name_len
的memcpy
之后的字节切换 - 不在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问题或放入类型强制转换。尽量保持简单。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在运行时处理类型擦除的数据-如何不重新发明轮子