【发布时间】:2012-02-03 09:42:48
【问题描述】:
我有一个带有 char 数组的对象;其中前 5 个字节(C++ 中的字符)是附加数据,之后的所有内容都是字符串消息。
所以我的问题是如何获取从起始索引 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,它也不会接受 data[]。 参数不是指针?
编辑::
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?
还有什么区别 “字符 * 数据” 和 "字符数据[]"
我认为数组和指针是一回事。
【问题讨论】:
-
使用:
strncpy或strcpy,并且数组在内存中是连续的,所以只需使用(source + 5)作为源缓冲区,这样可以确保您从源字符数组中的第 5 个字符开始复制。跨度> -
如果您可以更改您的消费者以接受开始/结束对,那么您根本不需要制作任何副本...
-
sizeof(data)是错误的。它会给你指针的大小,而不是它指向的 c 字符串的长度。请改用strlen(data)。