Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование кириллицы в HEX 
:(
    Опции темы
savage_fx
Дата 20.2.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 23.10.2006

Репутация: -1
Всего: 0



Как на Java перекодировать слово "Привет" к виду "0xd0bfd180d0b8d0b2d0b5d182" ?




PM MAIL   Вверх
powerOn
Дата 20.2.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Может быть так:

Код

        final String message = "Привет";
        for(int i = 0; i < message.length(); i++) {
            System.out.print(Integer.toHexString(message.charAt(i)));
        }



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
savage_fx
Дата 20.2.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 23.10.2006

Репутация: -1
Всего: 0



Цитата(powerOn @ 20.2.2010,  16:21)
Может быть так:

Код

        final String message = "Привет";
        for(int i = 0; i < message.length(); i++) {
            System.out.print(Integer.toHexString(message.charAt(i)));
        }






Выводит "41f440438432435442", а должно "0xd0bfd180d0b8d0b2d0b5d182". 

Для проверки значения, можно перекодировать любое русское слово в HEX-16 например через NotePad++




Это сообщение отредактировал(а) savage_fx - 20.2.2010, 16:36
PM MAIL   Вверх
mbasil
Дата 20.2.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 2
Всего: 13



У меня под рукой была программа кодирования, а ответ такой: 041F04400438043204350442.
Откуда вы взяли, что должно быть "0xd0bfd180d0b8d0b2d0b5d182"?
Код

import java.io.*;

public class EncodeUni{

    /** A table of hex digits */
    private static final char[] hexDigit = {
        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    private static final String LINESEP = System.getProperty("line.separator");

    public EncodeUni() {
    }
    public int encript( char[] arChi, int offset, int count,
                        char[] outBbuff, boolean escapeSpace ) {
        int n = 0, len;
        len = offset + count;
        for( int i=offset; i < len; i++ ) {
            char aChar = arChi[i];
            // Handle common case first, selecting largest block that
            // avoids the specials below
            if ((aChar > 61) && (aChar < 127)) {
                if (aChar == '\\') {
                    outBbuff[n++] = '\\';      outBbuff[n++] = '\\';
                    continue;
                }
                outBbuff[n++] = aChar;
                //outBuffer.append(aChar);
                continue;
            }
            switch(aChar) {
                case ' ':
                    if (i == 0 || escapeSpace) outBbuff[n++] = '\\';
                    outBbuff[n++] = ' ';
                    break;
                case '\t': outBbuff[n++] ='\t';
                           break;
                case '\n': String s = LINESEP;
                           int l = s.length();
                           for(int j=0; j < l; j++) outBbuff[n++] = s.charAt(j);
                           break;
                case '\r': // outBbuff[n++] ='\\';
                           outBbuff[n++] ='\r';
                           break;
                case '\f': // outBbuff[n++] ='\\';
                           outBbuff[n++] ='\f';
                           break;
                case '=': // Fall through
                case ':': // Fall through
                case '#': // Fall through
                case '!':  // outBbuff[n++] ='\\';
                           outBbuff[n++] = aChar;
                           break;
                default:
                    if ((aChar < 0x0020) || (aChar > 0x007e)) {
                        outBbuff[n++] = toHex((aChar >> 12) & 0xF);
                        outBbuff[n++] = toHex((aChar >>  8) & 0xF);
                        outBbuff[n++] = toHex((aChar >>  4) & 0xF);
                        outBbuff[n++] = toHex( aChar        & 0xF);
                    } else {
                        outBbuff[n++] = aChar;
                    }
            }
        }
        return( n );
    }
    /**
     * Convert a nibble to a hex character
     * @param   nibble  the nibble to convert.
     */
    private static char toHex(int nibble) {
        return hexDigit[(nibble & 0xF)];
    }
   public static void main(String[] args) {

//    int MAX_BUFLEN = 1024;
//    char[] inBbuff = new char[MAX_BUFLEN];
    String sin = "Привет";
    char[] inBbuff = sin.toCharArray();
    int count = inBbuff.length;
    char[] outBuff = new char[(count+10)*4]; 
    EncodeUni eu = new EncodeUni(); 
    int n = eu.encript( inBbuff, 0, count, outBuff, false );
    String s = new String( outBuff, 0, n );
    Console cons = System.console();
    cons.printf( "<"+s+">");
   }      
}

PM MAIL   Вверх
savage_fx
Дата 20.2.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 23.10.2006

Репутация: -1
Всего: 0



Попробуйте NotePad++

1) Введите слово "Привет"
2) Выберите из строки меню "TextFX" -> "TextFX Convert" -> "Convert text to HEX-16"


Также можно создать файл, напишите там слово "Привет" и сохраните в UTF-8 
Потом откройте HEX редактором и посмотрите

Будет именно "d0bfd180d0b8d0b2d0b5d182"


Это сообщение отредактировал(а) savage_fx - 20.2.2010, 17:23
PM MAIL   Вверх
mbasil
Дата 20.2.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 2
Всего: 13



Зависит от внутренней кодировки, в которой текст набран.
В Java внутреннее представление одно, а в ваших инструментах видимо другое.
Вы кодируете не то, как слово Привет видно, а внутренние коды символов.
PM MAIL   Вверх
powerOn
Дата 21.2.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(savage_fx @  20.2.2010,  16:32 Найти цитируемый пост)
Выводит "41f440438432435442"


Цитата(mbasil @  20.2.2010,  16:53 Найти цитируемый пост)
У меня под рукой была программа кодирования, а ответ такой: 041F04400438043204350442.


Если приглядеться то одно и тоже. В первом случе лишь не хватает 0 перед кодом символа.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.