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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с двоичным файлом, Проблема, связанная с кодировками 
V
    Опции темы
x_bot
Дата 18.2.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
У меня следующая продлема. Имеется двоичный файл, состоящий из полей, каждое поле закодированно своей кодировкой.
Основная ANSI, но есть и другие: cp1251, koi-8, ascii... Необходимо прочитать этот файл и вывести его на консоль и в awt-компонент, например TextArea. Пытался добыть закодированный текст из считанного массива байтов следующим методом:
Код

str = new String(reader, first, last, "ANSI-1251");

Но, увы при выводе кодировки появляются квадраты...
Пораметр -Dfile.encoding=ANSI-1251 не помогает.
Как поступить?
И вопрос в догонку, как оптимизировать считывание, то есть сделать его более рациональным( уменьшить код, повысить скорость обработки)? Ведь все поля имеют различное смещение, различное содержание, различный формат.
Заранее спасибо.
PM MAIL   Вверх
LSD
Дата 19.2.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Почему ты пишешь ANSI-1251? Такой кодировки нет, есть windows-1251.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x_bot
Дата 19.2.2007, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почему же нет? Есть! c.isSupported("ANSI-1251"); возвращается true. с - объект типа Charset. А ещё есть ANSI_X3.4-1986, на этом список кодировок ansi заканчивается...

Добавлено @ 05:29 
Нехитрый код всё покажет все кодировки:

Код

public class CharsetTest { 
    public static void main(String[] args) { 
        try { 
            SortedMap<String,Charset> registeredCharsets = Charset.availableCharsets(); 
            for ( Iterator<Charset> charsets = registeredCharsets.values().iterator(); charsets.hasNext(); ) { 
                Charset charset = charsets.next(); 
                System.out.print(charset.name() + "Aliases: <<"); 
                for ( Iterator<String> aliases = charset.aliases().iterator(); aliases.hasNext(); ) { 
                    System.out.print(aliases.next()); 
                    if ( aliases.hasNext() ) System.out.print(", "); 
                } 
                System.out.println(">>"); 
            } 
            System.out.println("\nПоддержка ansi  - " + Charset.isSupported("ANSI-1251")); 
        } catch ( Exception ex ) { 
            ex.printStackTrace(); 
        } 
    } 
}

PM MAIL   Вверх
LSD
Дата 19.2.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну раз он распознает такой алиас, то приведенный код должен работать.
Выложи пример демонстрирующий ошибку и файл с данными.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x_bot
Дата 19.2.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу прощения, но файл дать не могу. А код следующего вида:
Код

        try {
            is = new FileInputStream(f);
            bis = new BufferedInputStream(is); 
            byte reader[] = new byte[bis.available()];
            count = bis.read(reader);
            str = new String(reader, 0, count, "ANSI-1251");
            // как вариант
            //str = new String(reader, "ANSI-1251");
            System.out.print(str);
            bis.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

Экспериметы с кодировками не спасают.
PM MAIL   Вверх
LSD
Дата 20.2.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Я создал файл из одной строки в кодировке windows-1251, и у меня все нормально считалось.
Попробуй такой код:
Код
try
{
  File f = new File("test.txt");
  FileInputStream is = new FileInputStream(f);
  BufferedInputStream bis = new BufferedInputStream(is);
  byte reader[] = new byte[bis.available()];
  int count = bis.read(reader);
  String str = new String(reader, 0, count, "ANSI-1251");
  System.out.println(str);
  for(int i = 0; i < str.length(); i++)
    System.out.printf("\\u%1$04X", (int)str.charAt(i));
  System.out.println();

  bis.close();
  is.close();
}
catch(Exception e)
{
  e.printStackTrace();
}

Что он выдаст для файла состоящего из АБВ, по идее должен:
Цитата
АБВ
\u0410\u0411\u0412


Цитата(x_bot @  18.2.2007,  18:52 Найти цитируемый пост)
Но, увы при выводе кодировки появляются квадраты...

Куда выводишь?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x_bot
Дата 22.2.2007, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вывожу на консоль, и в TextArea. Просмотрев файл в двоичном редакторе, обнаружил, что многие байты вообще равны 0x00, соответственно \u0000, а это NULL. За него выводит квадрат.
PM MAIL   Вверх
LSD
Дата 22.2.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(x_bot @  22.2.2007,  02:41 Найти цитируемый пост)
Просмотрев файл в двоичном редакторе, обнаружил, что многие байты вообще равны 0x00, соответственно \u0000, а это NULL. За него выводит квадрат.

Проблема решена?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x_bot
Дата 12.3.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, проблему я решил. Теперь есть другая проблема. Двоичный файл, с которого всё читается, содержит поля заданного типа. Например, есть 4-х байтные числа с плавающей точкой(float).
F3 F2 C8 45 - при чтении побайтно соблюдается последовательность F3 F2 C8 45. Значения получаются весьма загадочные. Эмпирическим методом вывел, что если читать наоборот значения получаются какие нужно. Пообщался с людьми, такие проблемы существуют и в других языках, кроме C++. Как поступить то?

Можно по-деревенски:

Код

private float reverse(byte b[]) {
        int c = 0;
        float f = 0;
        byte temp[] = new byte[4];
        for (int i = 3; i >= 0; i--) {
            temp[c] = b[i];
            c++;
        }
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(temp));
        try {
            f = dis.readFloat();
        } catch (Exception ex) {}
        return f;
    } 


Однако опять загвоздка... Метод readFloat() возвращает значения, отличные от значений, которые хранились бы в переменных типа float с теми же байтами. Порядок проверял. Одинаковый. Фантастика какая-то... Или что-то не так.
И опять же, как повысить скорость всего этого вычислительного процесса?

PM MAIL   Вверх
LSD
Дата 13.3.2007, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Java записывает/читает согласно IEEE 754 floating-point "single format" bit layout, вопрос в том в каком формате пишет источник. Т.е. с помощью Float.floatToIntBits() можно получить int, а вот дальше вопрос как его записать в файл (аналогично чтение).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x_bot
Дата 13.3.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, так и есть. 

Float.intBitsToFloat(reverse(b)); - для случая, если метод reverse() возвращает int.

Переписал метод, теперь всё верно. Спасибо. А запись меня пока не интересует....

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

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

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


 




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


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

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