Как расшифровать логотип Nintendo с Gameboy?

Я попытался декодировать следующее растровое изображение, используя схему фоновой палитры, описанную на http://imrannazar.com/GameBoy-Emulation-in-JavaScript:-Graphics

CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E

источник: http://gbdev.gg8.se/wiki/articles/The_Cartridge_Header#0104-0133_-_Nintendo_Logo

Но я получил только что-то похожее на шум.

В каком направлении мне идти? Используется ли сжатие? Больше информации об этой свалке в инете не нашел.

Лучшее на данный момент (20-кратное увеличение): введите здесь описание изображения


person Julio Rodrigues    schedule 14.01.2014    source источник


Ответы (3)


Компрессии и шифрования нет вообще. Логотип имеет двоичную кодировку: 1 — черный, а 0 — белый/зеленый (как вы хотите назвать цвет фона игры).

Просто поместите шестнадцатеричную строку в правильном порядке, а затем преобразуйте шестнадцатеричные символы в двоичные:

Шестнадцатеричный:

C 6 C 0 0 0 0 0 0 1 8 0
E 6 C 0 3 0 0 0 0 1 8 0
E 6 0 0 7 8 0 0 0 1 8 0
D 6 D B 3 3 C D 8 F 9 E

D 6 D D B 6 6 E D 9 B 3
C E D 9 B 7 E C D 9 B 3
C E D 9 B 6 0 C D 9 B 3
C 6 D 9 B 3 E C C F 9 E

Бинарный:

1100 0110 1100 0000 0000 0000 0000 0000 0000 0001 1000 0000
1110 0110 1100 0000 0011 0000 0000 0000 0000 0001 1000 0000
1110 0110 0000 0000 0111 1000 0000 0000 0000 0001 1000 0000
1101 0110 1101 1011 0011 0011 1100 1101 1000 1111 1001 1110
1101 0110 1101 1101 1011 0110 0110 1110 1101 1001 1011 0011
1100 1110 1101 1001 1011 0111 1110 1100 1101 1001 1011 0011
1100 1110 1101 1001 1011 0110 0000 1100 1101 1001 1011 0011
1100 0110 1101 1001 1011 0011 1110 1100 1100 1111 1001 1110

Ну вот. Ваш логотип Nintendo (без 0 и пробелов):

11   11 11                             11       
111  11 11        11                   11       
111  11          1111                  11       
11 1 11 11 11 11  11  1111  11 11   11111  1111 
11 1 11 11 111 11 11 11  11 111 11 11  11 11  11
11  111 11 11  11 11 111111 11  11 11  11 11  11
11  111 11 11  11 11 11     11  11 11  11 11  11
11   11 11 11  11 11  11111 11  11  11111  1111 

Использование вместо 1:

██   ██ ██                             ██       
███  ██ ██        ██                   ██       
███  ██          ████                  ██       
██ █ ██ ██ ██ ██  ██  ████  ██ ██   █████  ████ 
██ █ ██ ██ ███ ██ ██ ██  ██ ███ ██ ██  ██ ██  ██
██  ███ ██ ██  ██ ██ ██████ ██  ██ ██  ██ ██  ██
██  ███ ██ ██  ██ ██ ██     ██  ██ ██  ██ ██  ██
██   ██ ██ ██  ██ ██  █████ ██  ██  █████  ████ 
person PBurggraf    schedule 08.07.2014
comment
Обратите внимание, что одна бинарная 1 соответствует не одному пикселю на экране, а четырем. В этом смысле на логотипе есть некоторое сжатие. - person Trey Keown; 07.09.2016
comment
@TreyKeown: эм, нет. Один бит по-прежнему представляет один пиксель. Вы путаете биты, байты и — поскольку байты имеют вертикальную полосу — кусочки. Количество данных не меняется для разных входных значений, оно постоянно. Следовательно, это форма кодирования, а не сжатия. - person Jongware; 15.07.2018
comment
Как PPU узнает, что эти байты следует располагать в точно таком же порядке? - person Faiz; 31.10.2020

В дополнение к ответу PBurggraf, вот фрагмент моего кода, который я использовал, чтобы проверить свое понимание этого.

static const uint8_t data[] = {
    0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83,
    0x00, 0x0C, 0x00, 0x0D, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
    0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, 0xBB, 0xBB, 0x67, 0x63,
    0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
};

for(int y=0; y<8; ++y)
{
    int i = ((y/2)%2)+(y/4)*24;
    for(int x=0; x<12; ++x,i+=2)
    {
        const uint8_t nibble = (y%2) ? (data[i]&0xF) : (data[i]>>4);
        for(int b=4; b--;) std::cout << (((nibble>>b)&1) ? "*" : " ");
    }
    std::cout << std::endl;
}

Он выводит:

**   ** **                             **       
***  ** **        **                   **       
***  **          ****                  **       
** * ** ** ** **  **  ****  ** **   *****  **** 
** * ** ** *** ** ** **  ** *** ** **  ** **  **
**  *** ** **  ** ** ****** **  ** **  ** **  **
**  *** ** **  ** ** **     **  ** **  ** **  **
**   ** ** **  ** **  ***** **  **  *****  **** 

Надеюсь, это поможет кому-то.

person DaleyPaley    schedule 04.08.2019

Уточнение:

И на логотипе есть своего рода шифрование/сжатие.

  1. Вы должны отсортировать шестнадцатеричную строку (расшифровать)
  2. Вы должны нарисовать каждый бит 4 раза (распаковать) Как pokechu22 сказал ранее.
person Nikolla Coumflage    schedule 14.12.2016