Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
16 / 14 / 7
Регистрация: 04.11.2011
Сообщений: 137
1

Правильный перевод из System::String^ в unsigned char и наоборот

10.11.2013, 20:52. Показов 3910. Ответов 10
Метки нет (Все метки)

Приветствую!

Мне нужно навесить GUI на одно приложение. Вся проблема в том, что функциям необходимо передавать параметры в unsigned char[], в то время как WinForms (насколько я понял понимает только System::String) и перевести не получается. Сам пробовал, в жутких потугах родил следующий быдлокод, который скомпилировался, но переводит строки не корректно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 const int MX=256;
                 NESSIEstruct NessieStruct;
                 memset(&NessieStruct,0,sizeof(NESSIEstruct));
                 NessieStruct.keyBits = 16;
                 typedef unsigned char BYTE;
                 String^ crK = this->textBox1->Text;
                 unsigned char Kk[256];
                 for (int i=0; i<crK->Length; i++)
                     Kk[i]+=(char)crK[i];
                 NESSIEkeysetup((BYTE*)Kk,&NessieStruct); 
                 BYTE pPlainText [MX];
                 BYTE pCipherText[MX];
                 String^ LineIn = this->textBox2->Text;
                 for (int i=0; i<LineIn->Length; i++)
                     pPlainText[i]+=(char)LineIn[i];
                 NESSIEencrypt(&NessieStruct,pPlainText,pCipherText);
                 Char LO[256];
                 for (int i=0; i<256; i++)
                     LO[i]+=(char)pCipherText[i];
                 String^ LineOut = gcnew String(LO);
                 textBox3->Text=LineOut;
             }
Текст самой программы здесь. Чтобы было понятнее, что к чему. Прошу помощи, подскажите, как это сделать.

Заранее благодарен.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2013, 20:52
Ответы с готовыми решениями:

Как преобразовать const unsigned char в System::String^?
Всем привет. Есть задание на Visual Studio c++ написать небольшую программку с Windows Forms....

Преобразование System::String в Char* и наоборот
Функция преобразования: void sts(String ^orig, char *&amp;out) { int length = orig-&gt;Length; out =...

Как перевести char[] в System::String^ и наоборот?
Как перевести char в System::String^ и наоборот? char c='q'; String^ s;...

Перевод System::String в char*
Попробовал перевести String в char таким способом: System::String ^host; host =...

10
Комп_Оратор)
Эксперт по математике/физике
8722 / 4452 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
11.11.2013, 13:47 2
Посмотрите не это ли нужно:
Конвертация строк: System::String в массив char/wchar_t, std::string и обратно
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
11.11.2013, 18:04 3
Цитата Сообщение от Naudiz Посмотреть сообщение
но переводит строки не корректно
Можно так :
System::String^ -> array<System::Byte> ^ -> unsigned char[]
Расшифровать :
unsigned char[] -> array<System::Byte> ^ -> System::String^
1
16 / 14 / 7
Регистрация: 04.11.2011
Сообщений: 137
12.11.2013, 20:01  [ТС] 4
MrCold, благодарю) Чяднт?

C++
1
2
3
4
using namespace System;
...
String^ crK = this->textBox1->Text;
unsigned char Kk[]= crK -> array<System::Byte> ^ -> unsigned char[];
Выхлоп
ClCompile:
Для всех выходных данных обновления не требуется.
SunCrypt.cpp
c:\documents and settings\user\мои документы\универ\оиб\ргр3\anubis\suncrypt\suncrypt\Form1.h(2 41): error C2065: crk: необъявленный идентификатор
c:\documents and settings\user\мои документы\универ\оиб\ргр3\anubis\suncrypt\suncrypt\Form1.h(2 41): error C2273: приведение типов в стиле функции: недопустимо в качестве выражения с правой стороны оператора "->"
c:\documents and settings\user\мои документы\универ\оиб\ргр3\anubis\suncrypt\suncrypt\Form1.h(2 41): error C2059: синтаксическая ошибка: ->

СБОЙ построения.
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
12.11.2013, 23:56 5
Не так буквально.
Имел ввиду Encoding.GetBytes
Encoding.GetString

Добавлено через 20 минут
Можно в виде такого класса

TConvert.h
C++
1
2
3
4
5
6
7
#pragma once
#include <Windows.h>
ref class TConvert
    {
      public: static System::Void SystemStringToUnsignedCharArray(System::String^ systemTextIn, BYTE* ucharTextOut);
      public: static System::String^ UnsignedCharArrayToSystemString( BYTE* ucharTextIn);
    };
TConvert.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "TConvert.h"
 
 
System::Void TConvert::SystemStringToUnsignedCharArray(System::String^ systemTextIn, BYTE* ucharTextOut)
      {
         array<System::Byte> ^ arrByte = System::Text::Encoding::UTF8->GetBytes(  systemTextIn);
         System::Runtime::InteropServices::Marshal::Copy(  arrByte,0,System::IntPtr( ucharTextOut),arrByte->Length);
      }
 
System::String^ TConvert::UnsignedCharArrayToSystemString( BYTE* ucharTextIn)
      {
         int length = strlen((const char*)ucharTextIn);
         array<System::Byte> ^ arrByte = gcnew array<System::Byte>(length);
         System::Runtime::InteropServices::Marshal::Copy(  System::IntPtr(   ucharTextIn),arrByte,0,length);
         return System::Text::Encoding::UTF8->GetString(arrByte);
      }
1
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
13.11.2013, 00:05 6
ваш консольный пример тоже лучше обернуть в класс

WrapNESSIE.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class WrapNESSIE
    {
    public:
        WrapNESSIE(void);
        void KeySetup(System::String^ Key);
        System::String^ Encript(System::String^ inText);
        System::String^ Decript();
    private :
        NESSIEstruct      NessieStruct; 
        BYTE             pKeyText [MAX_PATH];
        BYTE             pPlainText [MAX_PATH];
        BYTE             pCipherText[MAX_PATH];
   
    };
WrapNESSIE.CPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"
#include "WrapNESSIE.h"
 
 
 
WrapNESSIE::WrapNESSIE(void)
    {   
       memset(&NessieStruct,0,sizeof(NESSIEstruct)); 
       NessieStruct.keyBits = 16;
       memset(pKeyText, 0,MAX_PATH);
       memset(pPlainText, 0,MAX_PATH);
       memset(pCipherText,0,MAX_PATH);
    }
 
 
void WrapNESSIE::KeySetup(System::String^ Key)
    {
       memset(pKeyText, 0,MAX_PATH);
       TConvert::SystemStringToUnsignedCharArray(Key, pKeyText);
       NESSIEkeysetup((BYTE*)pKeyText,&NessieStruct); 
    }
 
System::String^ WrapNESSIE::Encript(System::String^ inText)
    {
        memset(pPlainText,0,MAX_PATH); 
        TConvert::SystemStringToUnsignedCharArray(inText, pPlainText);
        NESSIEencrypt(&NessieStruct,pPlainText, pCipherText); 
        memset(pPlainText,0,MAX_PATH); 
     return  TConvert::UnsignedCharArrayToSystemString( pCipherText);
    }
System::String^ WrapNESSIE::Decript()
    {       
          NESSIEdecrypt(&NessieStruct,pCipherText,pPlainText); 
          memset(pCipherText,0,MAX_PATH);
     return  TConvert::UnsignedCharArrayToSystemString( pPlainText);
    }
Пример использования
Form1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "WrapNESSIE.h"
///////////////////////////////
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {
                             if(!String::IsNullOrEmpty(textBox1->Text  )&& !String::IsNullOrEmpty(textBox2->Text  ))
                         {
                            WrapNESSIE wrapNESSIE;
 
                            wrapNESSIE.KeySetup(textBox1->Text);
                            textBox3->Text =  wrapNESSIE.Encript(textBox2->Text);
                             textBox4->Text = wrapNESSIE.Decript();
                              }
}
З.Ы. С русскими буквами библиотека похоже не работает
Миниатюры
Правильный перевод из System::String^ в unsigned char и наоборот  
1
16 / 14 / 7
Регистрация: 04.11.2011
Сообщений: 137
13.11.2013, 20:28  [ТС] 7
MrCold, спасибо, даже не ждал столь подробного ответа)

Мне кажется, что не все символы UTF-8 перегоняются из строки в массив.

WrapNESSIE.cpp
C++
1
2
3
4
5
6
7
8
System::String^ WrapNESSIE::Decript(System::String^ inText)
    {       
          memset(pCipherText,0,MAX_PATH); 
          TConvert::SystemStringToUnsignedCharArray(inText, pCipherText);
          NESSIEdecrypt(&NessieStruct,pCipherText,pPlainText); 
          memset(pCipherText,0,MAX_PATH); 
          return  TConvert::UnsignedCharArrayToSystemString( pPlainText);
    }

Form1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 if(!String::IsNullOrEmpty(textBox1->Text  )&& !String::IsNullOrEmpty(textBox2->Text  ))
                         {
                            WrapNESSIE wrapNESSIE;
                            wrapNESSIE.KeySetup(textBox1->Text);
                            textBox3->Text =  wrapNESSIE.Encript(textBox2->Text);
                            //textBox6->Text = wrapNESSIE.Decript();
                         }
             }
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             if(!String::IsNullOrEmpty(textBox4->Text  )&& !String::IsNullOrEmpty(textBox5->Text  ))
                         {
                            WrapNESSIE wrapNESSIEd;
                            wrapNESSIEd.KeySetup(textBox4->Text);
                            textBox6->Text = wrapNESSIEd.Decript(textBox5->Text);
                         }
         }
};
}
Миниатюры
Правильный перевод из System::String^ в unsigned char и наоборот  
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
13.11.2013, 23:37 8
Цитата Сообщение от Naudiz Посмотреть сообщение
Мне кажется, что не все символы UTF-8 перегоняются из строки в массив.
Насколько понимаю шифруется текст не более 16 символов .
Тут нужно копаться в исходниках nessie.h и anubis.срр
вот например строка намекает
C++
1
static void crypt(const u8 plaintext[/*16*/], u8 ciphertext[/*16*/],
Да и в консоли, на выходе строка не > 16 символов получается

Еще класс TConvert лучше переписать, так и с русскими символами можно работать

C++
1
2
3
4
5
6
7
8
9
10
11
12
void TConvert::SystemStringToUnsignedCharArray(System::String^ systemTextIn, BYTE* ucharTextOut)
      {
        char* chstr1 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(systemTextIn);                  
        strcpy(( char*)ucharTextOut,chstr1);    
        System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)chstr1);
 
      }
 
System::String^ TConvert::UnsignedCharArrayToSystemString( BYTE* ucharTextIn)
      {
         return gcnew System::String((char*)ucharTextIn);
      }
0
16 / 14 / 7
Регистрация: 04.11.2011
Сообщений: 137
14.11.2013, 07:12  [ТС] 9
MrCold, да, заметил ограничение в 16 символов, но проблема не в этом.

Если в одном и том же объекте применить и Encript и Decript, то расшифрованная строка выводится, потому что результат Encript уже хранится в поле класса, но если предположим, что исходного сообщения нет, а нужно расшифровать зашифрованное и я его считываю из другого textBox и передаю методу Decript, то дешифровать не удается.
Если длина сообщения > 16 символов, то такой код:
C++
1
2
3
4
                            WrapNESSIE wrapNESSIE;
                            wrapNESSIE.KeySetup(textBox1->Text);
                            textBox3->Text =  wrapNESSIE.Encript(textBox2->Text);
                            textBox6->Text = wrapNESSIE.Decript();
Работает корректно просто расшифрованное сообщение обрывается на 16 символе.

Вечером проверю передается ли полностью шифрованное сообщение в Decypt в hessie.h
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
14.11.2013, 13:40 10
Цитата Сообщение от Naudiz Посмотреть сообщение
Если в одном и том же объекте применить и Encript и Decript, то расшифрованная строка выводится, потому что результат Encript уже хранится в поле класса, но если предположим, что исходного сообщения нет, а нужно расшифровать зашифрованное и я его считываю из другого textBox и передаю методу Decript, то дешифровать не удается.
Класс WrapNESSIE привел лишь для примера. Как бы, рассчитывая, что уж вы сами напишите что нужно

Добавил к классу метод принимающий строку
C++
1
2
3
4
5
6
7
System::String^ WrapNESSIE::Decript(System::String^ inText)
    {       
         TConvert::SystemStringToUnsignedCharArray(inText, pCipherText);
         NESSIEdecrypt(&NessieStruct,pCipherText,pPlainText); 
         memset(pCipherText,0,MAX_PATH);
     return  TConvert::UnsignedCharArrayToSystemString( pPlainText);
    }
все нормально дешифруется .
Есть небольшая проблема. не всегда получается скопировать
зашифрованную строку. Буфер обмена не все краказябры принимает .
Других проблем не вижу.
Form1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
                 {
 if(!String::IsNullOrEmpty(textBox1->Text  )&& !String::IsNullOrEmpty(textBox2->Text  ))
     {
     WrapNESSIE wrapNESSIE;
     wrapNESSIE.KeySetup(textBox1->Text);
     textBox3->Text =  wrapNESSIE.Encript(textBox2->Text);
        }
}
     private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)
                          {
                              if(!String::IsNullOrEmpty(textBox4->Text  )&& !String::IsNullOrEmpty(textBox5->Text  ))
                             {
                                 WrapNESSIE wrapNESSIEd;
                                 wrapNESSIEd.KeySetup(textBox4->Text);
                                 textBox6->Text = wrapNESSIEd.Decript(textBox5->Text);
                            }
                          }
Миниатюры
Правильный перевод из System::String^ в unsigned char и наоборот  
0
16 / 14 / 7
Регистрация: 04.11.2011
Сообщений: 137
18.11.2013, 17:39  [ТС] 11
Цитата Сообщение от MrCold Посмотреть сообщение
Класс WrapNESSIE привел лишь для примера. Как бы, рассчитывая, что уж вы сами напишите что нужно
Добавил к классу метод принимающий строку
Кстати, я реализовал этот метод 3я постами выше (под спойлером).

С новой реализацией TConvert всё стало работать, как часы.

MrCold, Спасибо огромное от души. Очень помог)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2013, 17:39

Unsigned char * в char * и наоборот
Здравствуйте!помогите перевести unsigned char * в char * и наоборот без использования printf

Unsigned char to string
Привет всем. У меня полная непонятица unsigned char c = '1'; std::string ass((char*)c); ...

String to unsigned char[]
Всем привет. Что-то никак не могу придумать как преобразовать значения из Edit'ов в массив...

Строка string в unsigned char
Добрый день. Есть строка string с неким перечислением символов, надо его разобрать и передать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru