我有一个带char数组的对象;前5个字节(C ++中的char)是附加数据,之后的所有内容都是字符串消息。
所以我的问题是如何从索引5到最后一个字节获取字符串?
我知道有memccpy,但它需要一个结束字符,我事先无法知道。 我知道C ++中有一个字符串对象,但想法是来回传送一个包含数据和消息的字节数组。所以从某种意义上讲,我来回序列化和反序列化。
有什么建议吗?
编辑:
Packet * Packet::create(byte const data[])
{
//Concat all first 4 byte values to a uint32
unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0;
//4th element is packet type
PacketType type = (PacketType)data[4];
string packetData;
packetData.clear();
char * cdata;
//Check packet data is present
if(sizeof(data) > 5)
{
//string s((char)data);
//packetData = s.substr(4, s.length() - 4);
strncat(cdata,data+5,sizeof(data)-5);
packetData.append(cdata);
}
//Create new packet;
Packet * packet = new Packet(length,type,packetData);
return packet;
};
即使将其转换为char,它也不会接受数据[]。 参数不是指针?
编辑::
Packet * Packet::create(char const * data)
{
//Concat all first 4 byte values to a uint32
unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0;
//4th element is packet type
PacketType type = (PacketType)data[4];
//Set packet data, if available
string packetData = (sizeof(data) > 5) ? string(data+5):"";
Packet * packet = new Packet(length,type,packetData);
return packet;
};
我仍然需要对此进行测试,但我必须使用char,在这种情况下如何使用自己的typedef?
还有什么区别 “char *数据” 和 “char data []”
我认为数组和指针是同一个东西。
答案 0 :(得分:0)
将strcpy与charArray + 5
一起用作源参数。
您还应该知道strlen,它会为您提供字符串的长度[如果没有已知的上限,可能需要分配char[]
]。
编辑:代码快照:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char in[] = "XXXXXqwerty";
//dynamic allocation using strlen() if you don't have upper bound for in
char* out = new char[strlen(in) - 4];
strcpy(out,in+5);
cout << out;
delete[] out;
return 0;
}
答案 1 :(得分:0)
你提到“知道有memccpy,但它需要一个结束字符,我事先无法知道”。这是否意味着您的序列化数据既没有数据大小也没有分隔符?如果没有,你怎么期望 “string packetData =(sizeof(data)&gt; 5)?string(data + 5):”“;” 上班? 对于序列化,您可以在标题中发送数据大小。然后使用简单的memcpy。