Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2011, 04:39   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию С# HexToStr

Здравствуйте!
Помогите разобраться с переписанием функции Delphi на C#

Delphi:
Код:
function HexToStr(Sou: string): string;
Var t:integer; sl:string;
begin
With TStringList.Create Do
try
Text:=StringReplace(Sou,#32,#13#10,[rfReplaceAll]);
sl:='';
For t:= 0 to Count - 1 Do
sl:=sl+Chr(StrToInt('$' + Strings[t]));
Result:=sl;
finally
Free;
end;
end;
Получилось пока только функцию StrToHex правильно переписать:
Delphi:
Код:
function StrToHex(source: string): string;
var i:integer; c:Char; ste:string;
begin
ste:='';
for i:=1 to Length(source) do
begin
c:=source[i];
ste:=ste+IntToHex(integer(c),2)+' ';
end;
result:=ste;
end;
C#:
Код:
        private void StrToHex(String source)
        {
            int i;
            Char c;
            string ste;
            {
                ste = "";
                for (i = 0; i < source.Length; i++)
                {
                    c = source[i];
                    ste = ste + ((int)c).ToString("X") + ' ';
                }
                richTextBox2.Text = ste;
            }
        }
В общем помогите с HexToStr разобраться.

Последний раз редактировалось ZBEP; 07.02.2011 в 04:43.
ZBEP вне форума Ответить с цитированием
Старый 07.02.2011, 15:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

StrToHex попробуйте такой код:
Код:
            var sb = new System.Text.StringBuilder();
            sb.Append(string.Join(" ", sIn.ToCharArray().Select(b => ((int)b).ToString("X")).ToArray()));
sIn здесь входной параметер.
для отладки можете просто написать:
Код:
string sIn = "012ABC";
кстати, мне не понятно, почему Вы вместо строковой функции (как в Delphi) делаете процедуру?!


Добавлено
а вот и обратная функция:
Код:
        static private string HexToStr(string sIn)
        {
            var sb = new System.Text.StringBuilder();
            string[] sArr = sIn.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            sb.Append(string.Join("",sArr.Select(b => ((char)(Convert.ToSByte(b,16))).ToString()).ToArray()));
            return sb.ToString();
        }

p.s. за код на шарпе просьба ногами сильно не пинать — ибо я писать пытаюсь, но плохо понимаю, что я собственно пишу, и почему это работает...

Последний раз редактировалось Serge_Bliznykov; 07.02.2011 в 15:54.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2011, 16:26   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Serge_Bliznykov, спасибо!
Работает с цифрами и англ. буквами/словами
Если попробовать преобразовать рус текст Hex -> String, то вылетает ошибка и просит убедиться нет ли нигде деления на 0, может из-за того, что Рус. слова в Hex выглядят так: 420 443 441

П.с.
Насчет процедур, то у меня привычка такая сначала ими все реализовывать, а потом если надо, то в функцию (хз зачем).

Нашел, как преобразовывать StrToHex в нормальный вид, но код кривой какой-то:
Код:
private void StrToHex(String sIn)
        {
            foreach (byte b in ASCIIEncoding.ASCII.GetBytes(sIn))
            richTextBox2.Text += b > 15 ? String.Format("{0:X} ", b) : String.Format("0{0:X} ", b);
        }
Но теперь HexToStr не правильно воспринимает Рус. символы (кодировку).
Например получается:
StrToHex("й") = "3F"
HexToStr("3F") = "?"

Последний раз редактировалось ZBEP; 07.02.2011 в 18:18.
ZBEP вне форума Ответить с цитированием
Старый 08.02.2011, 23:01   #4
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Чет я совсем запутался с этим Encoding XD
Как мне сделать так, что бы StrToHex делала из "Слово" -> "D1 EB EE E2 EE", а не "421 43B 43E 432 43E" или "D0 A1 D0 BB D0 BE D0 B2 D0 BE" ?

Последний раз редактировалось ZBEP; 08.02.2011 в 23:15.
ZBEP вне форума Ответить с цитированием
Старый 08.02.2011, 23:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как мне сделать так, что бы StrToHex делала из "Слово" -> "D1 EB EE E2 EE", а не "421 43B 43E 432 43E"
мне уже поздно сегодня трепыхаться,
но направление, куда двигаться - я Вам могу подсказать - Вам нужно предварительно перекодировать текст в однобайтовую кодировку ANSI (она же Windows-1251), она же System.Text.Encoding.GetEncoding(12 51)

как конкрентно изменить кодировку символов в строке я не знаю. Завтра попытаюсь покопаться, если будет время (и задача не будет к этому времени решена, разумеется!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.02.2011, 00:29   #6
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Serge_Bliznykov, ок, большое спасибо за помощь!
Постараюсь сделать, в C# я вообще что-то туплю.
ZBEP вне форума Ответить с цитированием
Старый 09.02.2011, 09:42   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну вот, как и обещал, решение с перекодированием символов в кодовую таблицу 1251 (ANSI):
Код:
        static private string StrToHexRus(string sIn)
        {
            // Create a UTF-8 encoding.
            UTF8Encoding utf8 = new UTF8Encoding();
            Byte[] encodedBytes = utf8.GetBytes( sIn );
            encodedBytes = UTF8Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), encodedBytes);

            string sResult = "";
            foreach (Byte b in encodedBytes)
            {
                sResult += b > 15 ? String.Format("{0:X} ", b) : String.Format("0{0:X} ", b); 
            }
            return sResult;
        }

......
            string st1 = "Test: Слово";
            Console.WriteLine(st1 + " " + StrToHexRus(st1));

p.s. Боюсь, теперь у Вас будет следующий вопрос, как из HEX получить обратно строчку с русскими буквами...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.02.2011, 15:24   #8
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Serge_Bliznykov, ох спсибо!
Насчет вопроса Вы правы..
Сейчас пытаюсь понять:
Код:
sResult += b > 15 ? String.Format("{0:X} ", b) : String.Format("0{0:X} ", b);
Что бы сделать обратное, но либо я не в том направлении думаю либо хз..

Последний раз редактировалось ZBEP; 09.02.2011 в 15:27.
ZBEP вне форума Ответить с цитированием
Старый 10.02.2011, 00:15   #9
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Вот функция для перевода Hex в String учитывая Windows-1251.
Код:
        static private string HexToStr(string sIn)
        {
            char[] separators = new char[1] { ' ' };
            string[] chars = sIn.Split(separators, StringSplitOptions.RemoveEmptyEntries);
            byte[] bytes = new byte[chars.Length];
            for (int i = 0; i < chars.Length; i++)
            {
                bytes[i] = byte.Parse(chars[i], NumberStyles.AllowHexSpecifier);
            }
            return Encoding.GetEncoding(1251).GetString(bytes); 
        }
П.с.
Сам так и не смог додуматься, Mextrom, помог.
Способ не такой вроде, но для меня в данный момент более понятен. Какой из них более рационален хз, главное что работает
Правда полностью разобраться в них не помешало бы,но это уже позже.

Последний раз редактировалось ZBEP; 10.02.2011 в 00:17.
ZBEP вне форума Ответить с цитированием
Старый 10.02.2011, 10:18   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ZBEP, поздравляю, рад, что проблема решена.


добавлю,
Цитата:
Код:
bytes[i] = byte.Parse(chars[i], NumberStyles.AllowHexSpecifier);
NumberStyles описана в пространстве имён: System.Globalization

Последний раз редактировалось Serge_Bliznykov; 10.02.2011 в 10:26.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц