std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = val >> 24;
packed[1] = val >> 16 & 0xff;
packed[2] = val >> 8 & 0xff;
packed[3] = val & 0xff;
return std::string(packed, packed + 4);
}
int main() {
std::string myString = "qwerty";
std::string strLen = pack_uint32_be(myString.length());
std::string outString = strLen + myString;
const char* sendBuffer = outString.c_str();
std::cout
C/C++
Подскажите, почему получается пустая строка и как это исправить.
Если в строку попадают служебные символы - то результат будет не очень.
В данном случае packed[0] = 4>>24 = 0 (инт) что соответствует символу '\0'
Результирующая строка первым же символом имеет '\0' что по правилам Си является пустой строкой. Вот и не выводит ничего.
Если вначале требуются циферки то:
В данном случае packed[0] = 4>>24 = 0 (инт) что соответствует символу '\0'
Результирующая строка первым же символом имеет '\0' что по правилам Си является пустой строкой. Вот и не выводит ничего.
Если вначале требуются циферки то:
std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = '0'+(val >> 24);
packed[1] = '0'+(val >> 16 & 0xff);
packed[2] = '0'+(val >> 8 & 0xff);
packed[3] = '0'+(val & 0xff);
return std::string(packed, packed + 4);
}
Проблема в вашем коде заключается в том, что функция pack_uint32_be создает строку std::string, но она не учитывает символ конца строки (null-terminated character), который требуется для корректного вывода функцией std::cout << sendBuffer. Поэтому при попытке вывода sendBuffer выводится пустая строка, потому что отсутствует завершающий нулевой символ.
Чтобы исправить эту проблему, вы можете явно добавить нулевой символ в строку outString после конкатенации strLen и myString. Вот исправленный код:
cpp
Copy code
#include <iostream>
#include <string>
#include <cstdint>
std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = val >> 24;
packed[1] = val >> 16 & 0xff;
packed[2] = val >> 8 & 0xff;
packed[3] = val & 0xff;
return std::string(packed, packed + 4);
}
int main() {
std::string myString = "qwerty";
std::string strLen = pack_uint32_be(myString.length());
std::string outString = strLen + myString;
// Добавляем нулевой символ в конец outString
outString.push_back('\0');
const char* sendBuffer = outString.c_str();
std::cout << sendBuffer << std::endl;
return 0;
}
Теперь outString содержит нулевой символ в конце, что позволяет корректно выводить его с помощью std::cout.
Чтобы исправить эту проблему, вы можете явно добавить нулевой символ в строку outString после конкатенации strLen и myString. Вот исправленный код:
cpp
Copy code
#include <iostream>
#include <string>
#include <cstdint>
std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = val >> 24;
packed[1] = val >> 16 & 0xff;
packed[2] = val >> 8 & 0xff;
packed[3] = val & 0xff;
return std::string(packed, packed + 4);
}
int main() {
std::string myString = "qwerty";
std::string strLen = pack_uint32_be(myString.length());
std::string outString = strLen + myString;
// Добавляем нулевой символ в конец outString
outString.push_back('\0');
const char* sendBuffer = outString.c_str();
std::cout << sendBuffer << std::endl;
return 0;
}
Теперь outString содержит нулевой символ в конце, что позволяет корректно выводить его с помощью std::cout.
Похожие вопросы
- Что не так с 29 строкой и как это исправить?
- [c++] Почему при возврате строки по ссылке(const), она не выводится в консоль? Подробности внизу.
- Структуры на языке С++ Скажите пожалуйста, почему не работает программа ,и как её исправить?
- Подскажите почему не работает элементарнейший код на ардуино
- Строки с++, не получается написать никак код
- Найти максимальный элементы в строке матрицы
- Записать в файл те строки матрицы, которые содержат только один ноль С++ ПОМОГИТЕ ИСПРАВИТЬ КОД
- Как реализовать поиск похожей строки в базе данных?
- Программирование на С++ (строки)
- Двумерный динамический массив с неизвестны количеством столбиков или строк
я пытаюсь переписать функцию send_msg из этого кода python
https://stackoverflow.com/questions/17667903/python-socket-receive-large-amount-of-data/17668009#17668009
но второй день так и бьюсь над этим