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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2009, 13:15   #1
div_
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 5
Вопрос Перекодировка символьной строки из DOS -> Windows

Привет уважаемым программистам. Есть у меня к вам небольшой вопрос. После хорошо проведённого лета, знаний об ассемблере осталось совсем да ничего, а заниматься дальше надо. Так вот. Передо мной встала задача, перекодировать символьную строку из DOS кодировки в кодировку Windows. Хотелось бы чтобы вы подсказали ЧТО конкретно прочитать чтобы это сделать. (как я понимаю алгоритм такой: Забиваем строку в массив. Далее в цикле (длинною равной числу символов в строке) берём символ и прибавляем к нему какое то значение, чтобы символ из одной кодировки переместить в другую (слышал вроде что то о 30h и команде xlat, но могу и ошибаться). Так поступаем с каждым символом в строке. И в итоге, как результат, видим перекодированные символы в исходном массиве.) В общем как это грамотно реализовать мыслей нет. Очень надеюсь на вашу помощь! Заодно наверное и вспомню как это делается
div_ вне форума Ответить с цитированием
Старый 19.10.2009, 13:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
берём символ и прибавляем к нему какое то значение,
Вместо этого используем функцию WIN API OemToAnsi
Типа такого:
Код:
.data
;_______________
 arr db "hallo",0
 arr2 db 0 dup(10)

;_______________
.code
start:
 invoke OemToChar,offset arr,offset arr2
 invoke GetForegroundWindow
 invoke MessageBox,eax,offset arr2,0,0
ret
end start
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2009, 13:38   #3
div_
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 5
По умолчанию

Боюсь использование WinAPI преподаватель не оценит. Скорее сочтёт за "стыреннное с интернетов" =(
div_ вне форума Ответить с цитированием
Старый 19.10.2009, 14:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Все мы тырим из инета, и даже он.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2009, 14:48   #5
div_
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 5
По умолчанию

Ребята, наверняка кто то знает ответ на мой "больной" вопрос. Подскажите хотя бы где искать! =)
div_ вне форума Ответить с цитированием
Старый 19.10.2009, 14:52   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Помидитируй над таблицами дос и вин кодировок.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 19.10.2009, 16:56   #7
div_
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Помидитируй над таблицами дос и вин кодировок.
Подскажите если не трудно, в каком районе медитировать что ли?)
div_ вне форума Ответить с цитированием
Старый 19.10.2009, 20:05   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Открываете перед собой таблицы и смотрите как соответствуют друг другу русские символы(латинские совпадают).
Составляете табличку для перекодирования в которой в 81h элементе ('Б' в cp866) находится число 0С1h ('Б' в cp1251) и остальные буквы по аналогии. Далее смотрите действие команды xlat.

Либо ищите разности в кодах букв и реализуете вычисления для перевода, напр 0С1h - 81h = 40h, значит, для того чтобы перевести символ 'Б' из дос кодировки в вин, нужно прибавить к коду 40h.

Ну вот как-то так.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 19.10.2009, 21:49   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Составляете табличку для перекодирования в которой в 81h элементе ('Б' в cp866) находится число 0С1h ('Б' в cp1251) и остальные буквы по аналогии. Далее смотрите действие команды xlat.
+1
мне кажется через таблицы это будет и проще и нагляднее...


впрочем. вот алгоритм на Паскале для преобразования из DOS (OEM) в Windows (ANSI, она же Win1251):
Код:
procedure Convert1(var a:string);{ASCII->ANSI}
{OEM to ANSI}
var i:integer;
begin
for i:=1 to length(a) do
if ord(a[i]) in [128..175] then a[i]:=chr(ord(a[i])+64)
else if ord(a[i]) in [224..239] then a[i]:=chr(ord(a[i])+16)
else if ord(a[i])=240 then a[i]:=chr(ord(168))
else if ord(a[i])=241then a[i]:=chr(ord(184));
end;
если Паскаль совсем не знаете и алгоритм непонятен - пишите, поясню..

ps. а лично я, если бы передо мной стояла такая задача, всё таки сделал бы через таблички..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.10.2009, 23:32   #10
div_
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 5
По умолчанию

Serge_Bliznykov Паскаль понятен, асм не понятен =(
div_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекодировка текста DOS-Windows natasha Общие вопросы Delphi 4 19.10.2009 14:14
Из заданной символьной строки, выбрать те символы, которые встречаются в ней только один раз... Banny Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2008 06:15
Команды MS-DOS (точнее командной строки windows) kiraM Windows 4 03.09.2008 22:11
Как найти уникальное число для символьной строки? Paul Hindenburg Общие вопросы Delphi 13 14.02.2008 10:00