In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Forecast Channel"

From WiiBrew
Jump to navigation Jump to search
m (Robot: Cosmetic changes)
m
Line 1: Line 1:
 
{{Infobox channel
 
{{Infobox channel
 
| title      = Forecast Channel
 
| title      = Forecast Channel
| image      = [[File:Forecast Channel.png|200px]]
+
| image      = [[File:Forecastchannel.png|200px]]
 
| desc        = Weather informations
 
| desc        = Weather informations
 
| type        = General channel
 
| type        = General channel
| version    =  
+
| version    = 0.7 (7)
| peripherals = {{Wiimote1}} {{Internet}}  
+
| peripherals = {{Wiimote1}} {{Internet}}
 +
| wc24        = 1
 
}}
 
}}
  
Line 11: Line 12:
  
 
Some examples:
 
Some examples:
 
  
 
http://weather.wapp.wii.com/1/076/short.bin<br />
 
http://weather.wapp.wii.com/1/076/short.bin<br />

Revision as of 06:41, 3 September 2009

Forecast Channel
Forecastchannel.png
Version0.7 (7)
TypeGeneral channel
PeripheralsWiimote1.svg Internet

The Forecast channel download data packages from Nintendo servers via plain http connection.

Some examples:

http://weather.wapp.wii.com/1/076/short.bin
http://weather.wapp.wii.com/1/076/forecast.bin

http://news.wapp.wii.com/ displays a Red Hat Enterprise Linux Test Page.

File structure:

$0000 - $003F: padding (00)
$0040 - $013F: rsa encrypted sha-1 signature of rest of the file
$0140 - $0143: header
$0144 - .....: compressed data

The compression is very simple:

  1. Read one byte
  2. For each bit of the byte, msb-to-lsb,
    • if 0, copy one byte to the output
    • if 1, read 16 bits msb first in v, copy n bytes at offset m from the end of the output, n=3+(v>>12), m=v & fff

Quick and very dirty C code:

  i = 0x144;
  j = 0;
  while(i < size) {
    int k;
    int v = data[i++];
    for(k=0; k<8; k++)
      if(!(v & (1 << (7-k)))) {
        result_data[j++] = data[i++];
      } else {
        int vv = (data[i] << 8) | data[i+1];
        int nb = 3+(vv >> 12);
        int off = (vv & 0xfff);
        int l;
        i+=2;
        for(l=0; l<nb; l++) {
          result_data[j] = result_data[j-off-1];
          j++;
        }
      }
  }