P/SEND2 仕様メモ
- tags
- last modified2015-03-27
- created2015-02-18
前バージョンからの変更点
- 通信に使う記号をL/Hの2パターンからL/M/Hの3パターンへ
- 余った記号を使ってデータを圧縮
- BPE(風)とLZSS
- どうせ互換性無いのでヘッダなど整理
- 16bitカラーに変換する時にディザ処理追加
通信データ
記号
MSB LSB
#00 L L L L ... &h0
#01 M M L L ... &h1
#02 H H L L ... &h2
#03 L M M L ... &h3
#04 M H M L ... &h4
#05 L H H L ... &h5
#06 M L L M ... &h6
#07 H M L M ... &h7
#08 L L M M ... &h8
#09 M M M M ... &h9
#10 H H M M ... &hA
#11 L M H M ... &hB
#12 M H H M ... &hC
#13 H L L H ... &hD
#14 M L M H ... &hE
#15 H M M H ... &hF
#16 L L H H ... 位置記号
#17 M M H H ... 置換記号
#18 H H H H ... 開始/終端器号
波形はLSBからMSBの順で作成される.
あとで見返したら,MSBとLSBの逆にすべきだったなぁ……
順序
記号 中身
#18 開始記号
#01 L/Mしきい値計測用
#10 M/Hしきい値計測用
#xx#yy 置換記号で変換する1バイト((#xx << 4) OR #yy)
(データ本体)
#18#18 終端記号
終端記号が2度続くのは,受信側のプログラムを書きやすくするため. 1度目を受け取った時点で終了して良い.
ほかは基本的にリトルエンディアンなのだけど,4bit2つをバイトに直すときは上位下位の順でデータが来るので注意.
位置記号
スライド辞書によるデータ圧縮に使用する. 8bitの境界をまたぐタイミングで現れることは無い.
位置記号の直後の2byteは,挿入すべきデータ列までの相対位置とサイズを表す. 位置は12bit(1〜4096),サイズは4bitで(3〜18)を表す.
MSB 0 1 LSB
+------------------+-------------------------------+
|相対位置(下位8bit)|サイズ(4bit)|相対位置(上位4bit)|
+------------------+-------------------------------+
SIZE=(SRC[1]>>4)+3
POS=((SRC[1]<<8 OR SRC[0]) AND &HFFF)+1
置換記号
よく使われているバイト値に専用の記号を与えることでデータ削減する. 8bitの境界をまたぐタイミングで現れることは無い.
ヘッダ部
数値はリトルエンディアン.
offset byte
00h 1 予約(0)
01h 1 データタイプ
0 ... バイナリデータ
1 ... テキストデータ(8bit/置換テーブル)
2 ... テキストデータ(utf-16)
3 ... イメージデータ(8bitインデックス/RGBA5551)
4 ... イメージデータ(16bitカラー/RGBA5551)
02h 14 ファイル名.あまりは'\0'で埋める
利用可能文字「0-9 A-Z @ - .」
10h 4 データ部サイズ
14h 4 データ部チェックサム(adler32)
xxh n データ部
データ部
バイナリデータ
uint8 data[]
テキストデータ(8bit/置換テーブル)
uint8 num
struct {
uint8 src
uint16 dst
} table[num]
uint8 data[]
テキストデータ(utf-16)
uint16 data[]
イメージデータ(8bit/インデックス16bitカラー)
uint16 width // 画像の幅
uint16 height // 画像の高さ
uint8 num // パレットの色数
uint16 palette[num] // 色
uint8 pixels[] // 画素データ
イメージデータ(16bitカラー)
uint16 width // 画像の幅
uint16 height // 画像の高さ
uint16 pixels[] // 画素データ