Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Конвертирование строки в Unicode к ASCII


Автор: alpha1 8.7.2009, 07:42
Помогите, пожалуйста!!!
Есть dll, созданная с помощью Borland C++ Builder 6. В C# коде вызывается функция (из dll) 
char * DeCrypt(char *str), в нее передается аргумент строка. В C# char-ы в Unicode, а в C++ - в ASCII.
Как сконвертить Unicode в ASCII?  

Автор: Partizan 8.7.2009, 11:38
alpha1, 

Код

         // Create two different encodings.
         Encoding ascii = Encoding.ASCII;
         Encoding unicode = Encoding.Unicode;

         // Convert the string into a byte[].
         byte[] unicodeBytes = unicode.GetBytes(unicodeString);

         // Perform the conversion from one encoding to the other.
         byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);

Автор: alpha1 8.7.2009, 14:08
Partizan, я так пробовал
компилятор пишет ошибку, что внешний компонент создал исключение. Для полной картины приведу код:

Код

using System;
using System.Text;
using System.Runtime.InteropServices;


public partial class _Default: System.Web.UI.Page
{
     [DllImport("Project2.dll")]
     unsafe public static extern char DeCrypt(char *str);


     protected void Page_Load(object sender, EventArgs e)
     {
       
     }
      protected void Button1_Click(object sender, EventArgs e)  
      {
       ASCIIEncoding encoding = new ASCIIEncoding();
       string com="hgsdchkjsdhf";
       byte[] ba = encoding.GetBytes(com);
       unsafe
        {
         fixed(char *str = ba)  //Вот тут вылетает ошибка: "Не удается неявно преобразовать тип "byte*"  в  "char*""  
         Response.Write(DeCrypt(str));
         }
     }
}



Автор: Partizan 8.7.2009, 14:39
alpha1, я сомневаюсь, что в массиве ba лежит именно null-terminated строка. а во-вторых 

Код

using System;
using System.Text;
using System.Runtime.InteropServices;
public partial class _Default: System.Web.UI.Page
{
     [DllImport("Project2.dll")]
     unsafe public static extern char DeCrypt(char *str);
     protected void Page_Load(object sender, EventArgs e)
     {
       
     }
      protected void Button1_Click(object sender, EventArgs e)  
      {
         // Create two different encodings.
         Encoding ascii = Encoding.ASCII;
         Encoding unicode = Encoding.Unicode;
         // Convert the string into a byte[].
         byte[] unicodeBytes = unicode.GetBytes(unicodeString);
         // Perform the conversion from one encoding to the other.
         byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
         char[] charArray = ascii.GetString(asciiBytes).ToCharArray();
       unsafe
        {
         fixed(char *str = charArray)  //Вот тут вылетает ошибка: "Не удается неявно преобразовать тип "byte*"  в  "char*""  
         Response.Write(DeCrypt(str));
         }
     }
}


опять повторюсь, что в charArray наверняка лежит НЕ null-terminated срока, как того требует C/C++

Автор: PashaPash 8.7.2009, 14:50
alpha1, [пальцем в небо]
Код

     [DllImport("Project2.dll", CharSet=CharSet.Ansi)]
     public static extern String DeCrypt(String str);

Автор: alpha1 13.7.2009, 06:25
Partizan, большое спасибо за совет. Функция принимает входное значение, но теперь
проблема с тем как получить значение, которое возвращает функция (из dll) 
char * DeCrypt(char *str). Там тоже указатель

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