Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сказ про AnsiString и char*, где главгерой AnsiString 
:(
    Опции темы
UniBomb
Дата 24.2.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



Нет, вопрос не про конвертирование из AnsiString в char*, это я делаю так:

Код

AnsiString str;
char* charrr;

 str = <данные с ком порта>;
 charrr = new char[str.Length() + 1];
 StrCopy(charrr, str.c_str());


Проблема вот в чём - если в ком порт поступают байты с 0х00 по 0х32, то в переменной сharrr будет всякая ерунда. Например я каждый принятый символ перевожу в число:

Код

int j;

for(int i = 0; i <= <количество принятых байт>; i++)
 {
  j = charrr[i];
  Edit2->Text = Edit2->Text + IntToStr(i) + " ";
 }


Допустим я принимаю строчку  0x78 0x00 0x00 0x01 0xED но в результате получаю что-нить вроде 0x78 0x00 0x26 0x45 0x88

Я так подозреваю, что число 0х00 есть символ конца строки. Имеют ли символы после 0х00 действительное значение или нет???

Это сообщение отредактировал(а) UniBomb - 24.2.2007, 18:37


--------------------
PM MAIL ICQ Skype   Вверх
FFFFFFF7
Дата 24.2.2007, 18:55 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(UniBomb @  24.2.2007,  18:35 Найти цитируемый пост)
число 0х00 есть символ конца строки

так зачем, если это бинарные данные, запихивать в Строку? Для того есть тот же *int. 
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Fazil6
Дата 24.2.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



не int*, а unsigned char* , а еще лучше vector<unsigned char>

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

Код

AnsiString str; 
  std::vector<unsigned char> charrr;

 str = "ПРЕВЕД!\n\t\r\n\n\n\МЕДВЕД!";

 std::copy(str.c_str(), str.c_str() + str.Length(), std::back_inserter(charrr)); // заполняем массив значениями из строки //

 
 // так проверить что в charrr
 std::ostringstream s;
 std::vector<unsigned char>::iterator i = charrr.begin();
 while( i != charrr.end())
 {
        s << (int)*i << " " ;
        ++i;
 }
::MessageBox(0,s.str().c_str(),0,0);


Это сообщение отредактировал(а) Fazil6 - 24.2.2007, 19:49
PM MAIL   Вверх
FFFFFFF7
Дата 24.2.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вообще-то даже short достаточно.
Цитата(Fazil6 @  24.2.2007,  19:47 Найти цитируемый пост)
не int*, а unsigned char* , а еще лучше vector<unsigned char>

аргументируй.
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Fazil6
Дата 24.2.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

аргументируй.

что аргументировать?

PM MAIL   Вверх
FFFFFFF7
Дата 24.2.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



почему утверждаешь
Цитата(Fazil6 @  24.2.2007,  19:47 Найти цитируемый пост)
не int*, а unsigned char* , а еще лучше vector<unsigned char>


--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Fazil6
Дата 24.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а почему собственно int?
работаем с байтами, вполне подходит unsigned char.

PM MAIL   Вверх
FFFFFFF7
Дата 24.2.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Fazil6,  стукни меня (но не очень сильно), если я не прав - short это 0..255. //Вот беда - забыл Если это так, то этого вполне достаточно - всего 256 кодов (0..255). 
Цитата(Fazil6 @  24.2.2007,  22:30 Найти цитируемый пост)
а почему собственно int?

взято "с потолка"
Цитата(Fazil6 @  24.2.2007,  22:30 Найти цитируемый пост)
работаем с байтами, вполне подходит unsigned char.

аха. Это, как говорится, привычка.
НО: интересует больше всего это утверждение:
Цитата(Fazil6 @  24.2.2007,  19:47 Найти цитируемый пост)
а еще лучше vector<unsigned char>


Добавлено @ 22:40 
не понял смысла в использовании здесь этого класса
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Fazil6
Дата 24.2.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

не понял смысла в использовании здесь этого класса

а в чем смысл его неиспользования? vector полюбому удобнее динамического массива 
PM MAIL   Вверх
UniBomb
Дата 24.2.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



Окей, видать пропёр сказ... Ещё раз, но только подробнее. Есть функция компонента, которая считывает принимаемые данные с компорта. Да вот беда - полученные данные она возвращает АнсиСтринговую строку(( Теперь вот ломаю голову - то ли функция так данные искажает (см. пример в первом посте), либо руки у меня такие кривые (это более правдоподобно). Опираться будем на второй вариант. Так всё таки как мне строку разбить на символы и получить их (символов) коды?

А использование vector<unsigned char> это как по воробью из гаубицы.... в упор... 

Это сообщение отредактировал(а) UniBomb - 24.2.2007, 23:30


--------------------
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 25.2.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Так всё таки как мне строку разбить на символы и получить их (символов) коды?

вот так.
Код

std::copy(str.c_str(), str.c_str() + str.Length(), std::back_inserter(charrr)); // заполняем массив значениями из строки //


Цитата

А использование vector<unsigned char> это как по воробью из гаубицы.... в упор... 

с чего это вдруг? где его нужно использовать по Вашему?
PM MAIL   Вверх
UniBomb
Дата 25.2.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



Цитата

вот так.


Видать я до этого ещё не дорос)) Плохо я в своё время Си изучал((

Цитата

с чего это вдруг? где его нужно использовать по Вашему?


Если бы я знал что это, я бы сказал, где это можно использовать... Чтож, будем РТФМ... Спасибо))

И всё же пока хотелось бы узнать об альтернативных решениях))

Это сообщение отредактировал(а) UniBomb - 25.2.2007, 00:32


--------------------
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 25.2.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

И всё же пока хотелось бы узнать об альтернативных решениях))

альтернативное решение слишком громоздко. Для того чтобы использовать просто динамический массив нам придется таскать за ним как минимум информацию о размере (это не С строка и на 0 ориентироваться нельзя). Поэтому нужно инкапсулировать этот массив в класс. 
Код

class DataContainer
{
 public:
       DataContainer(const AnsiString &str) : size(str.Length())
       {
         data = new unsigned char[size];

         memcpy ( data , str.c_str(), size );
       }

       unsigned int GetDataSize() const  {   return size; }

        const unsigned char * GetData()  const   {  return data;    }

       ~DataContainer() { delete [] data;}
 
private:
      unsigned int size;
      unsigned char *data;
}  ;



это так, к примеру. Только вот существует STL и в ней уже все необходимое есть, а именно std::vector

PM MAIL   Вверх
UniBomb
Дата 25.2.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



Fazil6

Ок, так, значит так. Вот только описания этого класса(?) я в своих книжках не нашёл... Толи у меня книжки плохие, толи я искал плохо. Из примера я понял как мне скопировать строку. А вот как мне всё это добро разложить побайтно и занести, скажем, в масив интов?



--------------------
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 26.2.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Ок, так, значит так. Вот только описания этого класса(?) я в своих книжках не нашёл... 

я его сам прямо здесь написал. Откуда он в книжке возмется?
Цитата

Из примера я понял как мне скопировать строку. А вот как мне всё это добро разложить побайтно и занести, скажем, в масив интов?

она ведь и есть побайтно, куда ее раскладывать?

GetData() - возвращает указатель на первый элемент. 
GetDataSize() - получаешь размер.


GetDataSize() - 1 - максимальный индекс элемента в твоем массиве


Код

DataContainer d(str);

 const unsigned char * data = d.GetData();

// data[0] ... data[d.GetDataSize() - 1]  //  все побайтно. 


нахрена его в инты копировать? data - вот тебе массив байтов с твоими полученными значениями

Цитата

Ок, так, значит так. Вот только описания этого класса(?) я в своих книжках не нашёл...

vector чтоли? Что ты такое  читаешь? Страуструп, Мейерс, Сатер . 
STL - часть С++ .

Это сообщение отредактировал(а) Fazil6 - 26.2.2007, 00:47
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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