晒晒我的研究成果,txt转sky马上要问世
sky生成方法:
1.固定的前83个字节(从已有文件中截取)
2.第84字节,pack('H*',skytxt::binadd(dechex(strlen(书名)),2));
3.加上gb2312编码的书名数据
4.加上0x11 00 01 00 00 02 00 00 00 00
5.加上pack('H*',skytxt::binadd(dechex(strlen(简介)),4));
6.加上0x02 02 00 04 00 00 03 00 00 00 00 00
7.加上pack('H*',skytxt::binadd(dechex(strlen(作者)),2));
8.加上gb2312编码的作者
9.加上0x03 00 01 00 00 04 ff ff 00 00 00
循环{
1.加上pack('H*',skytxt::binadd(dechex(strlen(标题)),2));
2.加上UnicodeBF编码的标题
3.加上0x04 00 01 00 00 skytxt::qjc() 00 00 00 00
4.加上pack('H*',skytxt::binadd(dechex(strlen(内容)),4));
5.加上UnicodeBF编码的内容
6.加上0x06 00 01 00 00 skytxt::qjc() 00 00
7.如果只有一章,break;
#if()
8.如果不止一章,且未到末尾,加0x00 00 pack('H*',skytxt::binadd
(dechex(strlen(下章标题)+12)),4)) 00 0a 4e 0b 4e 00 7a e0 ff 1a +
标题数据 + 0x00 0d 03 00 01 00 00 skytxt::qjc() 00 00 00 00
#else()
9.如果到了末尾,加00 00 00 0a 00 0a 67 2c 4e 66 5b 8c 00 0d ,结束
}
关闭句柄,收工。
=================
class skytxt
{
static function binadd($f,$n)
{
while(strlen($f)<$n)
$f='0'.$f;
$f=substr($f,0,$n);
return $f;
}
static function qjc()
{
static $jc=4;
$jc++;
return $pack('H*',binadd(dechex($jc),2));
}
}
=================
/*********
[x,y]表示从第x字节起,偏移y字节
[+,x]表示紧接上一条末尾,且偏移x字节
[83,1++]表示从第38字节起,偏移1字节,其后跟着一段不定长的数据(通
常长度有前面这个字节指定)
**********/
[0,7]固定为skybook
[7,3]3个0x00
[10,2]这两个字节不懂
[12,1]固定为0x01
[13,3]这3个字节不知啥意思
[16,3]3个0x00
[17,1]章节类型,0x2E只有一章(无章节列表),0x36有章节列表。
[18,20]20个0x00
[36,15]15个字节,完整下载通道(猜)
[51,1]0x00
[52,15]15个字节,连载更新通道(猜)
[67,3]3个0x00
[70,10]固定为0x01 10 01 00 04 00 00 01 00 01
[80,3]3个0x00
[83,1++]1字节,标题长度(hexdec)。紧接着标题内容(GB2312编码)
[+,6]固定为0x11 00 01 00 00 02
[+,5]5个0x00
[+,1++]1字节,简介长度(hexdec)。紧接着简介内容(Unicode BF编码)
[+,6]固定为0x02 00 04 00 00 03
[+,5]5个0x00
[+,1++]1字节,作者名长度(hexdec)。紧接着作者名(GB2312编码)
[+,3]供研究的文件有4种取值,0x070000 0x040000 0x04ffff 0x030001
猜:0x030001表示免费(似乎是的)
[+,2]2个0x00
[+,3]有0x04ffff 0x040000两种取值,前一种表示免费
[+,3]3个0x00
[+,1++]1字节,第一个标题长度(hexdec)。紧接着标题内容(Unicode BF编
码)
[+,]
=================
内容数据后有一个字节具有特殊含义:
0x11 书名
0x02 简介
0x03 作者
0x04 标题
0x06 内容
0x00 跳章链接标题
=================
供采样的一组免费书中,前83个字节是完全相同的,且都有0x030001状态
码(自该状态码开始位置起8个字节免费书完全相同)。
其中几个文件已上传为0.sky-2.sky
=================
<?php
/*这是目前在文本文件编码转换工具中使用的sky转txt函数*/
function sky2txt($f)
{
if(substr($f,0,7)!='skybook') return $f;
$fn=83;$f2=true;
for(;$f2;)
{
$f2=hexdec(bin2hex(substr($f,$fn-1,2)));
$fn++;
$txt.=mb_convert_encoding("\r\n",'unicode','utf-8');
$txt.=substr($f,$fn,$f2);
$fn+=$f2+11;
}
return $txt;
}
?>