从char Array获取从索引到结尾的字符串

时间:2012-02-03 09:42:48

标签: c++ arrays string char

我有一个带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 []”

我认为数组和指针是同一个东西。

2 个答案:

答案 0 :(得分:0)

strcpycharArray + 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。