AMQP-CPP RabbitMQ получает дополнительный знак message.body () на единицу больше, чем message.size () - PullRequest
0 голосов
/ 04 июля 2018

Когда я получаю сообщение, я получаю содержимое сообщения с помощью message.body (), но всегда с дополнительным символом в конце. Содержимое message.body () всегда на единицу больше, чем message.size (). Дополнительный символ «Î» и имеет ASCII-код Decimal 206, я не понимаю, почему этот символ включен. Я всегда должен обрезать сообщение вокруг этого знака, чего не должно быть.

Мой обратный вызов для получения сообщений:

void Communicator_RabbitMQ::MessageCB(const AMQP::Message &message, uint64_t deliveryTag, bool redelivered)
{
    cout << "Message received: (" << message.body() << ") , " <<  "Body Size: " << message.bodySize() << endl;

}

Пример:

Опубликовал следующую полезную нагрузку через интерфейс управления RabbitMQ:: "12345"

Вывод из обратного вызова:

Message received: (12345�) , Body Size: 5

Debugger:

*(message.body() + 5)   0xce 'Î'    const char

Когда я получаю сообщение с помощью интерфейса управления RabbitMQ, я получаю следующую полезную нагрузку:

Payload 5 байтов 12345 Кодировка: строка

1 Ответ

0 голосов
/ 24 апреля 2019

Пожалуйста, примите во внимание, что

message.body()

возвращает указатель на строку с нулевым символом в конце. Вы должны использовать message.bodySize () для проверки фактической длины.

Пример 1: (копия содержимого)

void Communicator_RabbitMQ::MessageCB(const AMQP::Message &message, uint64_t deliveryTag, bool redelivered)
{
    cout << "Message received: (" << std::string(message.body(), message.body() + message.bodySize()) << ") , " << "Body Size: " << message.bodySize() << endl;
}

Пример 2: (с использованием представления строки c ++ 17)

void Communicator_RabbitMQ::MessageCB(const AMQP::Message &message, uint64_t deliveryTag, bool redelivered)
{
    cout << "Message received: (" << std::string_view(message.body(), message.bodySize()) << ") , " << "Body Size: " << message.bodySize() << endl;
}
...