Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа со строками содержащами байт x00


Автор: fire64 18.10.2008, 16:36
Код у меня конечно другой, но это ничего не меняет

Код



char text[2048];
text = "\xFF\xFF\x00\xFF"

char * pch;
pch = strtok (text," ,.-");


for(int i=0;i<n;i++)
{

    
    
    if  ( i % 16 == 0)
    {

    printf("\n");

    }
    
    else    
    {


    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");

    }    
    
}




в результате строка обрывается там где встречается байт x00

Автор: Sartorius 18.10.2008, 16:44
fire64, чего же ты хочешь ? так и должно быть - C работает с z - строками. Не нравится ноль как терминатор строки - пиши свои функции для работы со своим форматом строк

Автор: fire64 18.10.2008, 17:21
и что в C++ нет абсолютно никаких методов для работы с такими строками ?

Автор: Mayk 18.10.2008, 17:39
Цитата(fire64 @  18.10.2008,  21:21 Найти цитируемый пост)
и что в C++ нет абсолютно никаких методов для работы с такими строками ? 

std::string

Добавлено через 13 секунд
он не использует \0  как терминатор строки.

Автор: fire64 18.10.2008, 18:08
Mayk, нефига не работает

к тому коду что в первом посте добавил

std::string new_str( text);
printf ("%s", new_str);

для того что бы вывести на экран строку с x00 пришлось написать этот кошмарный код

Код

for(int i=0;i<n;i++)
{

    
    
    if  ( i % 16 == 0)
    {

    }
    
    else    
    {


    printf ("%c", text[i]);

    }    
    
}



но вот теперь вопрос, как преобразовать "%c", text[i] в единую строку ?


Автор: vinter 18.10.2008, 18:56
Код

std::string new_str( text);
std::cout << new_str;

Автор: fire64 18.10.2008, 19:07
Цитата(vinter @ 18.10.2008,  18:56)
Код

std::string new_str( text);
std::cout << new_str;



и в результате блин опять обрезается на первом x00 байте

как я уже говорил единственный способ вывода полной строки это

Код

for(int i=0;i<n;i++)
{
    
    
    if  ( i % 16 == 0)
    {
    }
    
    else    
    {
    printf ("%c", text[i]);
    }    
    
}


что бы справиться с мой проблемой надо каким-то образом, объединить все "%c", text[i] в одну строку
иначе строка будет обрезаться




Автор: 586 18.10.2008, 19:58
Цитата(fire64 @  18.10.2008,  20:07 Найти цитируемый пост)
и в результате блин опять обрезается на первом x00 байте

Код
#include <iostream>

int main(int argc, char* argv[])
{
    char data[] = "\xFF\xFF\x00\xFF";

    std::string s(data, &data[sizeof(data)-1]);
    // data - начало данных
    // &data[sizeof(data)-1] - конец данных

    /*
    std::string s;
    s.assign(data, &data[sizeof(data)-1]);
    */

    std::cout << "size: " << s.size() << std::endl;
    std::cout << std::hex;

    for(std::string::iterator i = s.begin(); i != s.end(); ++i)
        std::cout << (((int)(*i)) & 0xFF) << ' ';

    std::cout << std::dec;
    std::cin.get();

    return 0;
}

Автор: fire64 18.10.2008, 20:34
и в результате вместо текста из text
я получай вот это

Код

size: 2047
ff ff ff ff 6d 39 32 2e 32 34 31 2e 31 38 35 2e 32 33 3a 32 37 30 31 37 0 41 6e
74 69 63 68 61 74 20 7c 20 54 68 65 20 4d 61 66 69 61 0 73 75 72 66 5f 73 69 6d
70 73 6f 6e 73 5f 66 69 6e 61 6c 0 63 73 74 72 69 6b 65 0 43 6f 75 6e 74 65 72 2
d 53 74 72 69 6b 65 0 3 12 2f 64 6c 1 1 77 77 77 2e 63 6f 75 6e 74 65 72 2d 73 7
4 72 69 6b 65 2e 6e 65 74 0 0 0 1 0 0 0 0 9e f7 a 0 1 0 0 cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc



Автор: J0ker 18.10.2008, 21:25
у меня выводит
Код

size: 4
ff ff 0 ff

что совершенно правильно
у вас библиотеки какие-то кривые...

Автор: fire64 19.10.2008, 22:18
Цитата(J0ker @ 18.10.2008,  21:25)
у меня выводит
Код

size: 4
ff ff 0 ff

что совершенно правильно
у вас библиотеки какие-то кривые...

дело не в этом
просто у меня прога с сокетами
размер буфера составляет 2048
но не факт, что пакет помещённый в буфер будет иметь именно этот размер

Автор: J0ker 20.10.2008, 00:30
тогда вы неправильно поставили нам задачу
буфер это буфер, а строка это строка - не надо их мешать в кучу
принимаете буфер, потом парсаете
не забудьте только, что если у вас TCP то пакеты могут по дороге фрагментироваться
а если UDP - то доставка и последовательность не гарантированны.

Автор: Earnest 20.10.2008, 14:52
Все уже тебе написали.
Цитата(fire64 @  18.10.2008,  20:07 Найти цитируемый пост)
std::string new_str( text);

Вот здесь уже обрезается, и не поможет тебу string, т.к. при конструировании принимается именно z-cтрока.

Цитата(fire64 @  18.10.2008,  19:08 Найти цитируемый пост)
for(int i=0;i<n;i++)

Если ты знаешь n, то зачем тебе строки? Работай с байтами и не морочь голову.

Цитата(fire64 @  19.10.2008,  23:18 Найти цитируемый пост)
но не факт, что пакет помещённый в буфер будет иметь именно этот размер 

Значит, должен быть способ определения размера пакета, и никак не по 0-символу.

Автор: J0ker 20.10.2008, 18:40
Цитата(Earnest @  20.10.2008,  14:52 Найти цитируемый пост)
Все уже тебе написали.
Код

std::string new_str( text);

Вот здесь уже обрезается, и не поможет тебу string, т.к. при конструировании принимается именно z-cтрока.


там дальше конструктор от двух итераторов (поинтеров) - так ничего не обрезается

Автор: Earnest 20.10.2008, 18:48
А, в чьем-то примере? Да, не заметила. Но вопрос не в этом: да,  можно засунуть это в string - только зачем? 

Автор: J0ker 20.10.2008, 18:52
это не ко мне вопрос  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)