Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Из std::string в String


Автор: Zakhar_Shan 5.4.2009, 23:44
Введение(Можно пропустить):
Можете называть меня лузером, но эту тему в поиске так и не нашёл, по основному образованию я не программист, жизнь сделала меня математиком-нефтяником… но програмить люблю.
Введения часть 2 (Можно пропустить тоже):
В общем, задал я вопрос в теме: http://forum.vingrad.ru/forum/topic-254256/kw-%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/30.html#st_0_view_0
Ответ нашёлся, но проблема в том, что ответ этот возвращает std::string.
Причём смотрю я через builder, лежат в этом std::string 16 символов (а мне столько и нужно), а как не переведу в String получается 6… и символы совершенно нецензурные. Всякие квадратики, собачки итп….

Внимание вопрос (читать всем):
 как из std::string сделать String (ну или AnsiString)???
 smile 


M
dumb
Давайте чутка снизим нагрузку на глаза форумчан, ок?

Автор: Alca 5.4.2009, 23:51
Код

std::string sStr  = "StdString";
AnsiString asStr = "";
asStr = AnsiString(sStr.c_str());



Добавлено через 46 секунд
Код

std::string sStr  = "StdString";
AnsiString asStr(sStr.c_str());

Автор: Zakhar_Shan 6.4.2009, 00:09
Цитата(Alca @  5.4.2009,  23:51 Найти цитируемый пост)
:
    
std::string sStr  = "StdString";
AnsiString asStr(sStr.c_str());

неа вот код, может поможет:
Код

//---------------------------------------------------------------------------


#pragma hdrstop
#include <string>
#include <vcl.h>
#include <iterator>
#include <sstream>
const std::string cKey = "ver 2.0" ;
 std::string getProcId(){
 DWORD dwID1,dwID2;
    asm{
        pushad
        mov eax,3
        cpuid
        mov [dwID2],edx
        mov [dwID1],eax
        // mov [dwID2],ecx
        popad
    }
    return std::string(IntToHex(int(dwID1),8).c_str())+std::string(IntToHex(int(dwID2),8).c_str());
 }
 String getInputKey(){
    String res = String(getProcId().c_str());
    res.Insert("-",13);
    res.Insert("-",9);
    res.Insert("-",5);
    return res;
 }
//---------------------------------------------------------------------------
std::string xor_crypt (const std::string& src,
                                            const std::string& key){
    std::string result;
    result.reserve (src.length());
    for (std::string::const_iterator it = src.begin(); it!=src.end(); )
     for (std::string::const_iterator it1 = key.begin(); it!=src.end() && it1!=key.end(); ++it1, ++it)
     result.push_back (*it ^ *it1);
    return result;
}
    String generateLicKey(String inputKey){
        inputKey.Delete(15,1);
        inputKey.Delete(10,1);
        inputKey.Delete(5,1);
        std::string src =  inputKey.c_str();

        std::string sStr=xor_crypt (src,cKey);

        AnsiString asStr(sStr.c_str());
        return asStr;
    }

#pragma package(smart_init)


Обращение:
Код

String res = generateLicKey(getInputKey());

а res потом содержит: @SGb, хотя в sStr в _Buf лежит16 символов

Автор: mes 6.4.2009, 01:47
Цитата(Zakhar_Shan @  5.4.2009,  22:44 Найти цитируемый пост)
Причём смотрю я через builder, лежат в этом std::string 16 символов (а мне столько и нужно), а как не переведу в String получается 6… и символы совершенно нецензурные. 

Потому что результат операции xor_crypt нельзя расматривать как строку. Это просто массив символов и вам нужно написать свою операцию вывода. Для вывода на экран в частности там есть функция str2hex(). Или доработать функцию шифрования, чтоб в результате  не получались управляющие и специальные символы. 

Автор: Zakhar_Shan 6.4.2009, 13:35
Цитата(mes @  6.4.2009,  01:47 Найти цитируемый пост)
вам нужно написать свою операцию вывода


может для примерчика есть что?

Автор: A5uKa 6.4.2009, 14:27
Код

 return std::string(IntToHex(int(dwID1),8).c_str())+std::string(IntToHex(int(dwID2),8).c_str());

Цитата

E2285 Could not find a match for 'std::string::basic_string(wchar_t *)'
E2031 Cannot cast from 'wchar_t *' to 'std::string'


Автор: mes 6.4.2009, 14:48
Цитата(A5uKa @  6.4.2009,  13:27 Найти цитируемый пост)
как у тебя это


A5uKa, у Вас конфликт юникодовского wchar_t с ansi std::string smile

Автор: Zakhar_Shan 6.4.2009, 14:50
Цитата(A5uKa @ 6.4.2009,  14:27)
как у тебя это
Код

 return std::string(IntToHex(int(dwID1),8).c_str())+std::string(IntToHex(int(dwID2),8).c_str());

работает ?
у меня
Цитата

E2285 Could not find a match for 'std::string::basic_string(wchar_t *)'
E2031 Cannot cast from 'wchar_t *' to 'std::string'

... дома работает, а вот на работе нули дало....
[censored]
но ошибки такой нет...

Автор: A5uKa 6.4.2009, 14:52
Цитата(mes @ 6.4.2009,  14:48)
Цитата(A5uKa @  6.4.2009,  13:27 Найти цитируемый пост)
как у тебя это


A5uKa, у Вас конфликт юникодовского wchar_t с ansi std::string smile

И что мне делать  smile  ...

Доктор , а это лечится ?

Цитата

но ошибки такой нет... 


КАК !? А У МЕНЯ ОНА ОТКУДА :/ 
Проект char ? w_char ? что ещё... не знаю ... Как заставить это работать на BCB2009 !? 
 smile 

Автор: Zakhar_Shan 6.4.2009, 14:57
Цитата(A5uKa @  6.4.2009,  14:52 Найти цитируемый пост)
КАК !? А У МЕНЯ ОНА ОТКУДА :/ 

Да я сам дома на BCB2009 делал, всё работало...

Автор: A5uKa 6.4.2009, 14:59
Код

E2285 Could not find a match for 'std::string::basic_string(wchar_t *)'
E2031 Cannot cast from 'wchar_t *' to 'std::string'


вот просто стд стринг ...

Код

String getProcId(){

    return String(IntToHex(int(dwID1),8).c_str())+String(IntToHex(int(dwID2),8).c_str());

Автор: Alca 6.4.2009, 15:26
Project -> Options -> Directories and Conditionals ->_TCHAR maps to -> char

Автор: A5uKa 6.4.2009, 15:43
Цитата

Project -> Options -> Directories and Conditionals ->_TCHAR maps to -> char 

у меня и так чар тут просто это та же конвертация из std::string в String :/

Автор: Alca 6.4.2009, 15:53
Цитата

Код

return String(IntToHex(int(dwID1),8).c_str())+String(IntToHex(int(dwID2),8).c_str());


На эту строку ругается?

Автор: A5uKa 6.4.2009, 16:14
Цитата(Alca @ 6.4.2009,  15:53)
Цитата

Код

return String(IntToHex(int(dwID1),8).c_str())+String(IntToHex(int(dwID2),8).c_str());


На эту строку ругается?

Нет...
ругается на это

std::string src =  inputKey;

Код

E2285 Could not find a match for 'std::string::basic_string(const std::string&)'


(inputKey - стринг)

Автор: Alca 6.4.2009, 16:27
Код

std::string src(inputKey.c_str());

Автор: A5uKa 6.4.2009, 16:54
Код

 E2285 Could not find a match for 'std::string::basic_string(wchar_t *)'

Автор: Alca 6.4.2009, 17:07
тебе юникод нужен?

Добавлено через 5 минут и 5 секунд
Что у тебя здесь
Project -> Options -> Directories and Conditionals ->_TCHAR maps to ???
стоит?

Автор: mes 6.4.2009, 17:21
Цитата(A5uKa @  6.4.2009,  15:14 Найти цитируемый пост)
.
ругается на это

std::string src =  inputKey;

я так и не нашел в "оригинале" этой строки.. там есть
Код

std::string src =  inputKey.c_str();


Но меня мучает вопрос, зачем вводить std::string когда есть у же AnsiString.. чтоб внести дополнительную неразбериху в код ?
неужто трудно перевести функцию.. если так, то ловите  :
Код

AnsiString xor_crypt (const AnsiString& src,
                                            const AnsiString& key){
    AnsiString result=src;
    
    for (unsigned i = 1; i<=src.Length(); )
     for (unsigned j = 1; j<=key.Length() && i<=src.Length(); ++i, ++j)
     result[i]^=key[j];
    return result;
}

вроде так, хотя с АнсиСтринг не работал..

Автор: A5uKa 6.4.2009, 17:44
Цитата

Что у тебя здесь
Project -> Options -> Directories and Conditionals ->_TCHAR maps to ???
стоит? 

char

...
а что такое unsigned i ?

Автор: Alca 6.4.2009, 17:53
Выложи свой проект, дома гляну.  smile  

Автор: Anikmar 6.4.2009, 17:59
Блин, ну прямо форт Боярд  smile 

Автор: mes 6.4.2009, 18:31
Цитата(A5uKa @  6.4.2009,  16:44 Найти цитируемый пост)

а что такое unsigned ? 

unsigned int, (беззнаковый int) .. можно просто int, но тогда возможны предупреждения со стороны компилятора о том сравниваваем знаковое с безнаковым. smile

Автор: A5uKa 11.4.2009, 20:58
Это забавно но только дошло до меня что эта часть выдаёт 4х4 ноликов 

Код

 std::string getProcId(){
 DWORD dwID1,dwID2;
    asm{
        pushad
        mov eax,3
        cpuid
        mov [dwID2],edx
        mov [dwID1],eax
        // mov [dwID2],ecx
        popad
    }
    return std::string(IntToHex(int(dwID1),8).c_str())+std::string(IntToHex(int(dwID2),8).c_str());
 }
 String getInputKey(){
    String res = String(getProcId().c_str());
    res.Insert("-",13);
    res.Insert("-",9);
    res.Insert("-",5);
    return res;
 }


обидно...

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