TextW

Тема в разделе "WASM.WIN32", создана пользователем calidus, 6 сен 2008.

  1. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Code:
    drvnameW dw "c",":","","t","m","p","D","r","v",".","s","y","s",0
    drvname db 'c:\tmpDrv.sys',0


    Как перевести строку динамически drvname в drvnameW , естественно оба буфера будут пустые до перевода и поиска файла ?
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Код (Text):
    1. invoke lstrlen,drvname
    2. mov ecx,eax
    3. mov esi,drvname
    4. mov edi,drvnameW
    5. @@:
    6.   movzx al,byte[esi]
    7.   mov word[edi],ax
    8.   add edi,2
    9.   inc esi
    10.   dec ecx
    11.   jnz @B
    Вроде так. Хотя что значит динамически я не понял.
     
  3. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Спсб =) это значит что в переменную drvname попадают разные имена, а потом переводятся в W уже =) и так далее
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Если п все было так просто, функция MultiByteToWideChar() была бы нафиг не нужна.
     
  5. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Код (Text):
    1. invoke lstrlen,addr adwInBuffer
    2. mov ecx,eax
    3. lea esi,adwInBuffer
    4. lea edi,adwInBufferW
    5. @@:
    6.   mov al,byte ptr [esi]
    7.   mov word ptr [edi],ax
    8.   add edi,2
    9.   inc esi
    10.   dec ecx
    11.   jnz @B
    правленный вариант

    Ursus спсб за наводку
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    calidus
    Не всё так просто ;)
    В макросе делаю так
    Код (Text):
    1. ;-----------------------------------------------------------------------------
    2. ;   Определяет строку UNICODE заканчивающуюся нулём
    3. szUNICODE MACRO ANSI_String
    4.   % IRPC A_Char, <ANSI_String>
    5.     IFE ("&A_Char&" - 27h)  ; <- игнорировать символы кавычек ''
    6.     ELSEIFE ("&A_Char&" and 80h)    ; <= 7Fh - цифры и латиница
    7.         db "&A_Char&", 0h
    8.     ELSEIFE (("&A_Char&" and 0C0h) - 0C0h)  ; >= 0C0h Кириллица
    9.         db ("&A_Char&" - 0B0h), 04h
    10.     ELSEIFE ("&A_Char&" - 0A7h) ; §
    11.         db 0A7h, 0h
    12.     ELSEIFE ("&A_Char&" - 0A8h) ; Ё
    13.         db 01h, 04h
    14.     ELSEIFE ("&A_Char&" - 0A9h) ; ©
    15.         db 0A9h, 0h
    16.     ELSEIFE ("&A_Char&" - 0B8h) ; ё
    17.         db 051h, 04h
    18.     ELSEIFE ("&A_Char&" - 0B9h) ; №
    19.         db 016h, 21h
    20.     ELSEIFE ("&A_Char&" - 0AEh) ; ®
    21.         db 0AEh, 0h
    22.     ELSEIFE ("&A_Char&" - 0B0h) ; °
    23.         db 0B0h, 0h
    24.     ELSEIFE ("&A_Char&" - 0B1h) ; ±
    25.         db 0B1h, 0h
    26.     ENDIF
    27.     ENDM
    28.         dw 0h   ; завершающий ноль
    29. ENDM
    хотя и это охватывет не все ньюансы...
    Так что динамически надёжнее будет MultiByteToWideChar()
     
  7. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Y_Mur Спасибо большое , под динамически я понимал то что в процессе получаю путь до какогонибудь файла , потом нужно перевести в такой вид например \\system32\\config\\ , а потом в уникод строку чтобы подать этот адрес драйверу.

    функу MultiByteToWideChar() я включил сделал , но осталось добавить второй слэш в полный путь полученный поиском допустим файлов.
    А макрос интересный =)
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а почему сразу не использовать юникодовые апи, чтобы не заморачиваться потом с переводом строки?
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    MSoft, имхо лучше использовать свои, заточенные под конкретную задачу, 'апи'

    мои 'пять копеек':
    Код (Text):
    1. unicode_to_Ansi proc uni_string :dword, receiver_Ansi :dword
    2.  pushad
    3.    mov esi, receiver_Ansi
    4.    mov edi, uni_string
    5. edem:
    6.    cmp word ptr[edi], 0
    7.    je done
    8.    cmp byte ptr[edi], 0
    9.    je null
    10.    mov al, byte ptr[edi]
    11.    mov byte ptr[esi], al
    12.    inc esi
    13. null:
    14.    inc edi
    15.    jmp edem
    16. done:
    17.    inc esi
    18.    mov byte ptr[esi], 0
    19.  popad
    20. ret
    21. unicode_to_Ansi endp
     
  10. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) Спасибо ! У когонить есть идеи как лучше сделать из

    Код (Text):
    1.  drvname    db 'c:\xxx\tmpDrv.sys',0
    вот так

    Код (Text):
    1. drvname    db 'c:\\xxx\\tmpDrv.sys',0
    MSoft
    не знаю , так как то больше нравится , да и привык не с юникодом работать.
     
  11. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Код (Text):
    1. ...
    2. make_unicide:
    3. ...
    4.    cmp byte ptr[code_Ansi], 5ch
    5.    jne make_unicide
    6.    mov byte ptr[code_unicide], 5ch
    7.    inc code_unicide
    8.    mov byte ptr[code_unicide], 5ch
    9.    jmp make_unicide
    10.  ...
    что то типа такого ;)


    помоему, тс, вы создали тему не в том разделе
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    litrovith
    Во первых задача обратная из анси в уникод ;)
    А во вторых твои "5 коп" будут косячить даже на кириллице, не говоря уже о китайском и пр. так что если речь о вводе строки неизвестным юзером, то 5ю копейками не обойдёшся ;) - придётся писать полный аналог апи, или использовать готовую ;)

    calidus
    а здесь уже 5 коп прокатывает элементарно - копируешь посимвольно из строки в строку (почти как в #9, только обе строки анси) и встретив '\' добавляешь ещё один.
     
  13. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    Немножко не в тему - в какой-то книжке попалось упоминание о функции, которая конвертирует текст в ртф, и обратно вроде тоже может. Забыл где читал и не могу найти...
     
  14. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Многовато кода вообще-то. И strlen() там зря:
    Код (Text):
    1. macro AnsiToUnicode dest, src
    2. {
    3.     mov esi, src
    4.     mov edi, dest
    5.     xor eax, eax
    6.  
    7. @@:
    8.     lodsb
    9.     stosw
    10.  
    11.     test    eax, eax
    12.     jnz @r
    13. }
    И не работает если попадётся multi-byte как и было замечено.
     
  15. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Я привёл код для:
    Про кириллицу не подумал, а про "\\" не знал :)

    Скорее для masm'a. Мой для fasm'a.
     
  16. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) хмм .. тогда надо вручную всетаки , я апи функу использую уже , тогда переделают , кстати разницы между моим правленным для асма и апи функой я вроде не заметил .. хотя с 0 на конце еще не проверил. Спасибо )
     
  17. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Y_Mur
    во-вторых, я был пьян и, возможно, не понял что к чему ;) , во-первых, никто не говорил что будет все так просто(см. подпись)


    Y_Mur, "5 коп" работает почему то
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    litrovith
    ага вот так:
    Y_Mur, "5 :>? " @01>B05B ?>G5<C B>
    :)))

    calidus
    Для латиницы и не заметишь, но если делать профессионально, то имхо универсальность (многоязычность) лучше сомнительной "простоты" кода.
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Код (Text):
    1. %macro UTEXT 1
    2.  %assign  %%a 0
    3.  %assign  %%b 0
    4.  %strlen  %%b %1
    5.  %assign  %%c 1
    6.  %assign  %%d 0
    7.  %rep     %%b
    8.   %substr  %%a %1 %%c
    9.   %if %%d=0
    10.     %ifidn %%a, '/'
    11.         %assign %%d 1
    12.     %elif %%a > 127
    13.       DB %%a-0B0h,4
    14.     %else
    15.       DW %%a
    16.     %endif
    17.   %else
    18.     %assign %%d 0
    19.     %ifidn %%a, '/'
    20.       DW '/'
    21.     %elifidn %%a, 'n'
    22.       DW 0Dh, 0Ah
    23.     %elifidn %%a, 'r'
    24.       DW 0Dh
    25.     %elifidn %%a, 'l'
    26.       DW 0Ah
    27.     %elifidn %%a, 's'
    28.       DW 20h
    29.     %elifidn %%a, 'c'
    30.       DW 3Bh
    31.     %elifidn %%a, 't'
    32.       DW 09h
    33.     %elifidn %%a, '0'
    34.       DW 0
    35.     %elifidn %%a, '1'
    36.       DW 1
    37.     %else
    38.       DW '/', %%a
    39.     %endif
    40.   %endif
    41.   %assign %%c %%c+1
    42.  %endrep
    43.  DW 0
    44. %endmacro
    Это в nasm, yasm.
    Код (Text):
    1. UTEXT "c:\\xxx\\tmpDrv.sys"
    нормально переведет в unicode с добавлением завершающего нуля и нормальной обработкой "\\", "\n", "\t" работает для латиницы и кириллицы, а для "китайского и пр." естественно не подойдет -- там свое подобие unicode (кодировка gb и big5)
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Mikl___
    заглючит на §Ё©ё№®°± и пр. спецсимволах ;)

    Так что макрос не катит - я свой привёл только чтобы продемонстрировать, что уникод вообще-то не сводится к "5 коп" ;)

    ТС нужна не "нормальная обработка" а "\" -> "\\"

    ЗЫ: не люблю когда проги начинают глючить от того что их помещают в каталог с русскими буквами, пробелами и т.п., и увы - такой прокол частенько встречается, причём как правило такие проги даже не соизволяют уведомить юзера, что же им собственно не нравится.