Существует 2 почти идентичные функции по преобразованию вектора в строку.
Отличие — create_filtered_string игнорирует F и более "крупные числа"
inline void vector_to_string(std::vector<boost::uint8_t> const& in, std::string& out) {
int len = in.size();
char *p = new char(len + 1);
for (int i = 0; i < len; i++)
p[i] = in[i] < 10 ? in[i] + 48 : in[i] + 55;
p[len] = 0;
out = std::string(p);
delete(p);
}
inline void create_filtered_string(std::vector<boost::uint8_t>& in, std::string& out)
{
int len = in.size();
char *p2 = new char(len + 1);
for (int i = 0; i < len; i++)
{
if(in[i] < 10)
{
p2[i] = in[i] + 48;
}
else if(in[i] < 15)
{
p2[i] = in[i] + 55;
}
}
p2[len] = 0;
out = std::string(p2);
delete(p2);
}
Пример использования
unsigned char undef[] = {0x05 , 0x01 , 0x05 , 0x00 , 0x02 , 0x02 , 0x04 , 0x00 , 0x04 , 0x09 , 0x07 , 0x07 , 0x02 , 0x03 , 0x06 , 0x0f};
std::vector<boost::uint8_t> tst(undef, undef + sizeof(undef));
std::string out;
ASN1::vector_to_string(tst, out);
cout<<"vector_to_string(tst, out);"<<endl;
std::cout<<out<<std::endl;
std::string out2;
ASN1::create_filtered_string(tst, out2);
cout<<"create_filtered_string(tst, out);"<<endl;
std::cout<<out2<<std::endl;
но на выходе получаем интересное:
> ./convertVectorString
ASN1::vector_to_string(tst, out);
515022404977236F
ASN1::create_filtered_string(tst, out);
515022404977236F
То есть идентичные строки.
Если из объявления
void create_filtered_string(std::vector<boost::uint8_t>& in, std::string& out)
убрать ссылочность на in и оставить std::vector<boost::uint8_t> in все проходит ожидаемо — F на конце не входит в итоговую строку.
> ./convertVectorString
ASN1::vector_to_string(tst, out);
515022404977236F
ASN1::create_filtered_string(tst, out);
515022404977236
Что за особенность поведения такая?