C/C++

Подскажите, почему получается пустая строка и как это исправить.

 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
Если в строку попадают служебные символы - то результат будет не очень.
В данном случае 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);
}
МА
Максим Анорин
51 417
Лучший ответ
Досбол Байхонов не совсем цифры...
я пытаюсь переписать функцию send_msg из этого кода python
https://stackoverflow.com/questions/17667903/python-socket-receive-large-amount-of-data/17668009#17668009
но второй день так и бьюсь над этим
Проблема в вашем коде заключается в том, что функция 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.
ДС
Денис Ссс
84 672