Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобпазование типов: std::string->unsigned char[] 
V
    Опции темы
Alca
Дата 1.11.2008, 23:52 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Преобпазование типов: std::string -> unsigned char[]?

Строку:
Код

std::string sStr("01234567");

надо преобразовать в
Код

unsigned char ucBuffer[8];


Это сообщение отредактировал(а) Alca - 2.11.2008, 12:34


--------------------
PM WWW ICQ Skype Jabber   Вверх
J0ker
Дата 2.11.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



метод c_str() возвращает const char * для std::string


--------------------
user posted image
PM MAIL   Вверх
Alca
Дата 2.11.2008, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



const char * это же не unsigned char[]


--------------------
PM WWW ICQ Skype Jabber   Вверх
J0ker
Дата 2.11.2008, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



нет таких типов T[] - либо должен быть размер массива больше нуля (для C++), либо это эквивалентно T* (если, конечно, переменная сразу не инициализированна массивом)
std::string - это массив char'ов
к const unsigned char* можно преобразовать
reinterpret_cast<const unsigned char *>(s.c_str());




--------------------
user posted image
PM MAIL   Вверх
Alca
Дата 2.11.2008, 02:20 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Код

unsigned char ucBuffer[8] = reinterpret_cast<const unsigned char *>(csStr.c_str());

Код

error C2440: 'initializing' : cannot convert from 'const unsigned char *' to 'unsigned char [8]'


Это сообщение отредактировал(а) Alca - 2.11.2008, 02:27


--------------------
PM WWW ICQ Skype Jabber   Вверх
dumb
Дата 2.11.2008, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Alca, елы-палы. у тебя под тыщу сообщений, все примерно на одну тему, а АЗЫ никак не одолеем... smile
Код
strcpy(ucBuffer, csStr.c_str()); // без учета ограничения по длине. в "реальной жизни" так делать опасно.

PM MAIL   Вверх
J0ker
Дата 2.11.2008, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Alca @ 2.11.2008,  02:20)
Код

unsigned char ucBuffer[8] = reinterpret_cast<const unsigned char *>(csStr.c_str());

Код

error C2440: 'initializing' : cannot convert from 'const unsigned char *' to 'unsigned char [8]'

нехорошо конвертировать const в неconst
но если приспичило
unsigned char *ucBuffer = const_cast<unsigned char>(reinterpret_cast<const unsigned char *>(csStr.c_str()));

Добавлено @ 03:27
тока предупреждаю - модифицировать данные по адресу ucBuffer нельзя - они принадлежат std::string  smile 


Это сообщение отредактировал(а) J0ker - 2.11.2008, 03:28


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 2.11.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(J0ker @  2.11.2008,  02:03 Найти цитируемый пост)
std::string - это массив char'ов

никогда в жизни
std::string - это класс
реализация может быть разной  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 2.11.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(J0ker @  2.11.2008,  03:25 Найти цитируемый пост)
тока предупреждаю - модифицировать данные по адресу ucBuffer нельзя - они принадлежат std::string

мало того, они долго не проживут, поэтому нужно сначала выделить память в достаточном количестве, потом скопировать туда то, что возвращает c_str().
PM MAIL Skype GTalk   Вверх
Alca
Дата 2.11.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Какой вариант наиболее оптимальный?
Вариант 1:
Код

    std::string sStr("01234567");
    unsigned char ucBuffer[8];
    
    strcpy((char *)ucBuffer, sStr.c_str()); 

Вариант 2: (не уверен корректный ли)
Код

    std::string sStr("01234567");
    unsigned char ucBuffer[8];

    for (unsigned int i = 0; i < sStr.size(); i ++) {
        int iChar = sStr.at(i);    
        if (iChar < 0) {
            iChar = 256 + iChar;    //здесь iChar < 0
        } 
        ucBuff[i] = iChar;
    }



--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 2.11.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



вообще, можно и проще сделать
Код

std::string str("i am string");
std::vector<unsigned char> data;//i am array
std::copy(str.begin(), str.end(), std::back_inserter(data));

PM MAIL Skype GTalk   Вверх
Cтpaнник
Дата 2.11.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Дык, тогда уж зачем заморачиваться с выделением памяти "в достаточном количестве"?
Код

std::vector<unsigned char> v;
v.assign(reinterpret_cast<const unsigned char *>(csStr.begin()), reinterpret_cast<const unsigned char *>(csStr.end()));
// вуаля!

PM MAIL   Вверх
Lazin
Дата 2.11.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

unsigned char* array = &data[0];
 smile 
PM MAIL Skype GTalk   Вверх
mes
Дата 2.11.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alca @  2.11.2008,  12:25 Найти цитируемый пост)
    std::string sStr("01234567");
    unsigned char ucBuffer[8];
    for (unsigned int i = 0; i < sStr.size(); i ++) {
        int iChar = sStr.at(i);    
        if (iChar < 0) {
            iChar = 256 + iChar;    //здесь iChar < 0
        } 

        ucBuff[i] = iChar;
    }

 smile  smile  smile 
Кто нибудь может разъяснить тайный смысл сего написанного ?

Это сообщение отредактировал(а) mes - 2.11.2008, 12:50


--------------------
PM MAIL WWW   Вверх
Alca
Дата 2.11.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

Кто нибудь может разъяснить тайный смысл сего написанного ?

Ну типа того:
Код

    for (unsigned int i = 0; i < csStr.size(); i ++) {
        int iChar = (unsigned int)csStr.at(i);    
        ucBuff[i] = iChar;
    }


Это сообщение отредактировал(а) Alca - 2.11.2008, 13:16


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 2.11.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alca @  2.11.2008,  13:15 Найти цитируемый пост)
    for (unsigned int i = 0; i < csStr.size(); i ++) {
        int iChar = (unsigned int)csStr.at(i);    
        ucBuff[i] = iChar;
    }

вот с какого боку там int iChar, когда  ucBuff типа  unsigned char.

во первых можно написать короче, без непонятно для чего нужного приведенния к int
Код

  for (unsigned int i = 0; i < csStr.size(); i ++)  { ucBuff[i]  = static_cast<unsigned char>(csStr.at(i)); }

во вторых в цикле мы должны быть уверены, что  ни при каком значение i мы не выйдем за границу выделенной памяти для ucBuff.


Это сообщение отредактировал(а) mes - 2.11.2008, 14:04


--------------------
PM MAIL WWW   Вверх
Alca
Дата 2.11.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



А чем принципиальное отличие?
Код

    for (unsigned int i = 0; i < csStr.size(); i ++) {
        ucBuff[i] = (unsigned int)csStr.at(i);
    }

и
Код

    for (unsigned int i = 0; i < csStr.size(); i ++)  { 
        ucBuff[i]  = static_cast<unsigned char>(csStr.at(i)); 
    } 



--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 2.11.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alca @  2.11.2008,  13:51 Найти цитируемый пост)
 ucBuff[i] = (unsigned int)csStr.at(i);

строчка не полна, и заставляет программиста лишний раз задуматься о происходящем, хотя никакой дополнительной нагрузки вышеупомянутый код не несет.

во первых если делаете преобразование , то старайтесь делать его точно. А так вы оставляете преобразование unsigned int->unsigned char на волю компилятора.
во вторых точное преобразование типа static_cast всегда лучше си-каста (использованного в Вашем примере).
 smile 

Это сообщение отредактировал(а) mes - 2.11.2008, 14:05


--------------------
PM MAIL WWW   Вверх
Alca
Дата 2.11.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Спасибо.

Это сообщение отредактировал(а) Alca - 2.11.2008, 17:33


--------------------
PM WWW ICQ Skype Jabber   Вверх
JackYF
Дата 2.11.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Тему пометил решённой.

Добавлено через 28 секунд
Нет, не пометил smile
Топикстартер, помечай.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
J0ker
Дата 2.11.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(MAKCim @ 2.11.2008,  10:36)
Цитата(J0ker @  2.11.2008,  02:03 Найти цитируемый пост)
std::string - это массив char'ов

никогда в жизни
std::string - это класс
реализация может быть разной  smile

отчасти согласен, но смею указать, что спецификация метода c_str() приводит к тому, что эффективная реализация string в 99.99999% - это все-таки массив


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 3.11.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(J0ker @  2.11.2008,  19:49 Найти цитируемый пост)
отчасти согласен, но смею указать, что спецификация метода c_str() приводит к тому, что эффективная реализация string в 99.99999% - это все-таки массив

какая спецификация можети об этом говорить? c_str() возвращает сторонний буфер который умрет при любом изменении стринга, каким образом это связано с внутренностью стринга?


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 3.11.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(vinter @  3.11.2008,  14:23 Найти цитируемый пост)
какая спецификация можети об этом говорить?

никакая

Цитата(vinter @  3.11.2008,  14:23 Найти цитируемый пост)
c_str() возвращает сторонний буфер

обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 3.11.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(J0ker @  3.11.2008,  17:53 Найти цитируемый пост)
обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна 

ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода  smile 
поэтому c_str() в принципе не должен использоваться часто, а значит и реализация не обязана быть эффективной


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
J0ker
Дата 3.11.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(MAKCim @ 3.11.2008,  19:32)
Цитата(J0ker @  3.11.2008,  17:53 Найти цитируемый пост)
обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна 

ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода  smile 
поэтому c_str() в принципе не должен использоваться часто, а значит и реализация не обязана быть эффективной

а я разве говорил где-то про обязательства?
проясняю ситуацию
в связи с тем, что:
1. c_str() быть обязана
2. организация внутреннего буфера std::string в виде нэйтив массива ничему не препятствует в плане эффективности на большинстве современных архитектур
- внутренний буфер std::string организован обычно в виде массива



--------------------
user posted image
PM MAIL   Вверх
Lazin
Дата 3.11.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(MAKCim @  3.11.2008,  19:32 Найти цитируемый пост)
ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода

я не согласен, многие интерфейсы используют const char* чтобы быть более универсальными, например, что-бы можно было написать так:
Код

void foo(const char*);
...
foo("blablabla");

иначе пришлось бы писать так:
Код

foo(std::string("blablabla"));
 smile

Добавлено через 1 минуту и 30 секунд
хотя нет, можно было-бы писать foo("blablabla") в любом случае, просто в случае std::string неявно был бы вызван конструктор smile 
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 3.11.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



J0ker, 
это все понятно
вопрос в чем вообще?
Цитата(J0ker @  2.11.2008,  02:03 Найти цитируемый пост)
std::string - это массив char'ов

Цитата(MAKCim @  2.11.2008,  10:36 Найти цитируемый пост)
никогда в жизни
std::string - это класс
реализация может быть разной


ты с чем-то не согласен?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
J0ker
Дата 4.11.2008, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



ладно, MAKCim, ты победил  smile 


--------------------
user posted image
PM MAIL   Вверх
JackYF
Дата 4.11.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Вообще говоря, лишние конструкторы - лишнее падение производительности... ;)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.