Получить строку от начального индекса до конца из массива символов - PullRequest
1 голос
/ 03 февраля 2012

У меня есть объект с массивом char; где первые 5 байтов (символ в C ++) являются дополнительными данными, а все последующее - строковым сообщением.

Итак, мой вопрос: как мне получить строку из начального индекса 5 вплоть до последнего байта?

Я знаю, что есть memccpy, но для этого требуется конечный символ, который я не могу знать заранее. Я знаю, что в C ++ есть строковый объект, но идея состоит в том, чтобы отправлять туда и обратно байтовый массив, который содержит данные и сообщения. Так что в некотором смысле я сериализую и десериализирую туда-сюда.

Есть предложения?

Edit:

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 * data" а также "char data []"

Я думал, что массивы и указатели - это одно и то же.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Вы упомянули "знаю, что есть memccpy, но для этого требуется конечный символ, который я не могу знать заранее". Означает ли это, что ваши сериализованные данные не имеют ни размера данных, ни разделителя? Без этого, как вы ожидаете "string packetData = (sizeof (data)> 5)? string (data + 5):" ";" работать? Для сериализации вы можете отправить размер ваших данных, а также в заголовке. Затем используйте простой memcpy.

0 голосов
/ 03 февраля 2012

используйте 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;
}
...