Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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