Локализация графики NHZT-W58

Раздел форума посвященный Локализации (русификации), а так же переводу на другие языки.

Модераторы: bellic, NaviGuru, minja71

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 21 мар 2017, 12:29

Итак, приступаю к попыткам локализации интерфейса указанной в теме Нави-Магнитолы...

Что будем искать?
Предположительно - в ПО магнитолы должны быть текстовые сообщения на японском языке и графические элементы.
Начинаем с самого простого - поиск графики! А еще точнее - с поиска графики, НЕУПАКОВАННОЙ в спец-форматы !!!

Работать с программой ISE2 я честно сказать, так и не научился, поэтому в Интернете была найдена следующая - MultiExtractor...

Анализу были подвержены все файлы, находящиеся на открытых разделах HDD магнитолы... Но нас интересуют в первую очередь ресурсы, находящиеся в папке PRG, где находятся "кирпичики" системы.
мультиэкстрактор.jpg
Улов - не велик!
2016-11-7-15-01-39.jpg
Еще пока три скриншота....
2017-3-21-15-31-56.jpg
2017-3-21-15-31-49.jpg
2017-3-21-15-32-05.jpg
Напомню, что найденные выше графические ресурсы, расположены в открытом и незакодированном виде, непосредственно в файлах BRS.BIN, SD.BIN, MM.BIN и LDM.BIN.
Последний - был предварительно "препарирован" из скрытого RAW-раздела.

На этом пожалуй поиск свободно сохраненных графических ресурсов в Системе AISIN можно считать законченным!
Но это вовсе не значит конец поискам!... ;)

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 21 мар 2017, 18:20

Еще до начала поиска, методом поиска текста и известных сигнатур, было выяснено, что внутри BIN-файлов находятся графика не только в открытом виде, но и закодированная особыми алгоритмами, не известными программе MultiExtractor - это графика формата BMP.S2, BMP.SL и возможно другими.
Выделенная область КРАСНЫМ цветом - похожа на таблицу, ЗЕЛЕНАЯ снизу - похоже на тело самого файла BMP.S2-формата:
bmp.s2.jpg
Тут мне подсказали, что у пользователя одного из форумов AS21 имеется программа его собственного изготовления JREMAKER, позволяющая распаковывать, просматривать и извлекать некоторые ресурсы из файлов LOADING.KWI, составными частями которых и были имеющиеся у меня BIN-файлы.

Что то я уже перешел на повествование... :evil: :grin:

В общем - берем свой набор BIN-файлов и в командной строке склеиваем их простой командой:

Код: Выделить всё

[b]copy /B loading_zagolovok.bin+aisin_zagolovok.bin+ldm_v562.bin+apfm.bin+apm.bin+aum.bin+brs.bin+dig.bin+drm.bin+drm1.bin+font.bin+mapm.bin+mdm.bin+mm.bin+mrpm.bin+osm.bin+sd.bin+ttslibm.bin+vrm.bin LOADING.KWI[/b]
(Команда вводится без разрывов - в одной строке!!!)
где:
loading_zagolovok.bin
и
aisin_zagolovok.bin - заранее подготовленные файлы определенной длины, забитые нулевыми значениями.

Еще немного поколдовав над значениями некоторых полей у меня получился корректный файл LOADING.KWI - собранный вручную и готовый для дальнейших экспериментов.
(Хорошо бы написать программу - выполняющую вышеуказанные операции в автоматическом режиме... :smile: )

С помощью JREMAKER-а из блока SD.BIN было "выужено" и распаковано в ВМР-формат 483 файла формата BMP.S2 и один - BMP.SL.
jremaker.jpg
Причем последний - из графики, относящейся к навигации, поэтому им можно пренебречь!
4e373564cf03.jpg
4e373564cf03.jpg (9.27 КБ) 1636 просмотров
Забыл упомянуть! - На самом деле упакованных изображений в блоках гораздо больше, но меня интересуют только те, которые имеют надписи на японском языке!!!
Они то и были подвергнуты экзекуции! ;)
2016-12-28-13-39-02.jpg
Если кому интересно - можете скачать архив и сами посмотреть полученные картинки:
extract.rar
(813.84 КБ) 75 скачиваний
P.S. Кстати - кто-то утверждал, что JREMAKER мне не сможет помочь?!
А вот оказывается - очень даже пригодился!
Огромное спасибо автору Николаю (AS21), написавшего эту программу!!! ;)
...
P.S. Не знаю по какой причине, но JREMAKER не нашел некоторые НЕ УПАКОВАННЫЕ картинки, которые были найдены с помощью MultiExtractor-a... :?

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 22 мар 2017, 12:02

Начинаем изучать закодированные изображения формата bmp.s2...
Ищем с помощью JREMEKER-a небольшое по размеру изображение, например mp038.bmp.s2
kvadrat.jpg
...и экспортируем его ТРИ различных формата.

1. В таком виде изображение находится в БИН-файле (SD.BIN) - по его аббревиатуре, это КОНТЕЙНЕР:
контейнер.jpg
2. А это - содержащееся в контейнере закодированное изображение S2:
s2.jpg
3. Собственно - чистое ВМР-изображение, полученное после раскодировки:
bmp.jpg
На этом скриншоте даже видно, что Редактор даже сам определил поля формата - табличка внизу...

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 27 мар 2017, 12:11

В общем выкладываю два архива - набор файлов к двум ВМР-картинкам формата S2:
  1. mp038.bmp - реальный размер 16х16, увеличенным выглядит так:

    mp038_big.jpg
    mp038_big.jpg (3.65 КБ) 1609 просмотров
    mp038_S2.rar
    (894 байт) 53 скачивания
  2. hwy05.bmp - реальный размер 24х18, увеличенным выглядит так:

    hwy05_big.jpg
    hwy05_big.jpg (5.55 КБ) 1609 просмотров
    hwy05_S2.rar
    (570 байт) 62 скачивания

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 27 мар 2017, 12:19

Для декодирования упакованных картинок формата bmp.s2 использовался следующий код на С++:

Код: Выделить всё

/// <summary>
/// Распаковка .bmp.s2
/// </summary>
/// <param name="coData">Запакованные данные</param>
/// <param name="unSize">Размер распакованных данных</param>
/// <returns>Массив распакованных данных</returns>
private static byte[] Decompress(byte[] coData, int unSize)
{
    // словарь
    var dict = new byte[0x421];
    // начальное смещение в словаре
    var dictOffset = 0x3de;
    // распакованные данные
    var unData = new byte[unSize];
    // смещение в буфере запакованных данных
    var coOffset = 0;
    // смещение в буфере распакованных данных
    var unOffset = 0;
    // контрольный байт
    var control = 0;

    try
    {
        while (true)
        {
            // следующий бит контрольного байта
            control = control >> 1;
            // кончились контрольные данные?
            if ((control & 0x100) == 0)
                // считываем контрольный байт
                control = coData[coOffset++] | 0xff00;

            // бит в контрольном байте = 0 (неупакованное значение)
            if ((control & 1) == 0)
            {
                var value = coData[coOffset++];
                unData[unOffset++] = value;
                dict[dictOffset++] = value;
                dictOffset &= 0x3ff;
                // переходим к сл. контрольному биту
                continue;
            }

            // упакованные данные (контрольный бит = 1)

            // считываем команду
            var command = coData[coOffset++];
            
            if (command < 0x80)
            {
                // формируем из 3х бит команды и считанного значения абсолютное смещение в словаре
                var offset = coData[coOffset++] | ((3 & command) << 8);
                // выделяем из команды количество байт распакованных данных - 1
                var count = (command >> 2) + 2;
                // распаковываем
                while (count-- >= 0)
                {
                    var value = dict[offset++ & 0x3ff];
                    unData[unOffset++] = value;
                    dict[dictOffset++] = value;
                    dictOffset &= 0x3ff;
                }
            }

            else if (command < 0xc0)
            {
                // формируем из команды относительное смещение в словаре
                var offset = command & 0xf;
                // выделяем из команды количество байт распакованных данных - 1
                var count = ((command & 0x30) >> 4) + 1;
                // распаковываем
                while (count-- >= 0)
                {
                    var value = dict[(dictOffset - offset) & 0x3ff];
                    unData[unOffset++] = value;
                    dict[dictOffset++] = value;
                    dictOffset &= 0x3ff;
                }
            }
            // иначе идет набор неупакованных данных
            else
            {
                // размер неупакованных данных - 1
                var count = (command & 0x3f) + 7;
                // копируем данные
                while (count-- >= 0)
                {
                    var value = coData[coOffset++];
                    unData[unOffset++] = value;
                    dict[dictOffset++] = value;
                    dictOffset &= 0x3ff;
                }
            }
        }
    }
    // избавляемся от проверок размерности массивов
    // и считаем первое исключение по выходу за границы массива концом распаковки
    catch (IndexOutOfRangeException ex)
    {
    }
    // остальные исключения отлавливаем
    catch
    {
        throw;
    }
    return unData;
}
Для декодирования упакованных картинок формата bmp.sl использовался следующий код на С++:

Код: Выделить всё

/// <summary> Распаковываем с байта, который перед "ВМ" стоит.
/// Распаковка .bmp.sl
/// </summary>
/// <param name="coData">Запакованные данные</param>
/// <param name="unSize">Размер распакованных данных</param>
/// <returns>Массив распакованных данных</returns>
private static byte[] DecompressSl(byte[] coData, int unSize)
{
    // словарь
    var dict = new byte[0x1011]; // присвоение значения переменной dict=[Bh] - типа словарь
    // начальное смещение в словаре
    var dictOffset = 0xfee; 
    // распакованные данные
    var unData = new byte[unSize];
    // смещение в буфере запакованных данных
    var coOffset = 0;
    // смещение в буфере распакованных данных
    var unOffset = 0;
    // контрольный байт
    var control = 0;

    try		// оператор try разрешает обнаружение исключительной ситуации для остального кода
    {
        while (true)		// начало бесконечного цикла
        {
            // следующий бит контрольного байта
            control = control >> 1;
            // кончились контрольные данные?
            if ((control & 0x100) == 0)
                // считываем контрольный байт
                control = coData[coOffset++] | 0xff00;

            // бит в контрольном байте = 1 (неупакованное значение)
            if ((control & 1) != 0)
            {
                var value = coData[coOffset++];
                unData[unOffset++] = value;
                dict[dictOffset++] = value;
                dictOffset &= 0xfff;
            }
            // бит в контрольном байте = 0 (упакованное значение)
            else
            {
                var loOffset = coData[coOffset++];
                var mixData = coData[coOffset++];

                var offset = ((mixData & 0xf0) << 4) | loOffset;
                var count = (mixData & 0xf) + 2;

                // распаковываем
                while (count-- >= 0)
                {
                    var value = dict[offset++ & 0xfff];
                    unData[unOffset++] = value;
                    dict[dictOffset++] = value;
                    dictOffset &= 0xfff;
                }
            }
        }
    }
    // избавляемся от проверок размерности массивов
    // и считаем первое исключение по выходу за границы массива концом распаковки
    catch (IndexOutOfRangeException)
    {
    }

    return unData;
}
Автор приведенного кода - Х27, любезно разрешил использовать и публиковать его без ограничений!.. ;)

В принципе - искать и распаковывать картинки можно с помощью JREMAKER-a, а вот от задачи Упаковки исходных BMP-изображений в формат bmp.s2 никак не уйти.

Надеюсь получится из приведенного кода понять общий смысл распаковки, сам формат bmp.s2 и написать утилиту для упаковки!

Аватара пользователя
minja71
Сообщения: 68
Зарегистрирован: 12 мар 2017, 12:41
Откуда: Санкт-Петербург

Локализация графики NHZT-W58

Сообщение minja71 » 27 мар 2017, 12:56

а x27, попросить на основе своего кода и упаковщик написать?

Аватара пользователя
bellic
Сообщения: 883
Зарегистрирован: 11 мар 2017, 07:47
Откуда: Rostov-on-Don
Контактная информация:

Локализация графики NHZT-W58

Сообщение bellic » 27 мар 2017, 13:08

minja71 писал(а): а x27, попросить на основе своего кода и упаковщик написать?
Я разговаривал с ним на эту тему...
Ответил, что ему это все уже не интересно и в свое время он около недели пытался, но безрезультатно... :(

Аватара пользователя
vitecd
Сообщения: 171
Зарегистрирован: 12 июл 2017, 06:29
Откуда: Auckland, NZ
Контактная информация:

Локализация графики NHZT-W58

Сообщение vitecd » 12 июл 2017, 08:42

а кто тут вообще на чем кодить могЁт?

Ответить

Вернуться в «Локализация (переводы)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей