无线我的无限

让无线技术给生活带来无限快乐
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

jmbook.dat的手机电子书格式

Posted on 2009-03-09 13:34  freemobile  阅读(2796)  评论(0编辑  收藏  举报

    最近有很多朋友问jmbook.dat是一个什么样的电子书格式,以及手机电子书制作软件如何开发的问题,那我就在今天这篇文章里一起来做个说明。

    先来介绍一下jmbook.dat的格式,说白了,它其实就是一个jar包,只是改了一下扩展名,这个包里已经包含了在手机上运行所需要的java基本程序代码,它所缺少的只是跟具体手机电子书内容相关的部分,(角摩手机电子书,http://www.joymo.cn)把内容部分加入到这个jar包后,它就是一个完整的可以在手机上安装运行的手机电子书jar文件了。

  那么内容部分包括什么东西,又怎么把内容部分加入到.dat文件中,这便是joymobiler整个手机电子书制作软件的核心。 首先我们来看看哪些内容是我们要放到.dat中去的,包括三部分,索引文件,数据文件以及MANIFEST。

    一、索引文件(该索引文件采用跟JBookMaker一样的格式,所以兼容JBookMaker的电子书)

    它的格式是固定的,如果不能按正确的格式生成索引文件,程序在运行后就没法正常显示电子书内容,文件名就是"0"。格式如下:

头三个字节:0x00,0x01,0x30

双字节:书名长度

接着字节:书名内容 (UTF8编码)

双字节:书的章节数量长度

接着字节:书的章节节数量(UTF8编码)

双字节:第一章节标题长度

接着字节:第一章节标题内容(UTF8编码)

...(其余章节标题长度和标题内容)

四字节:版权信息长度

接着字节:电子书进入时的界面显示内容,可以放作者、制作者一类的信息,用回车换行分隔即可(UTF8编码)

  二、数据文件

  文件名从1开始,按2,3,4。。。在顺序依次递增,数据文件的数量跟索引文件中书的章节数量一致。文件采用UNICODE编码方式。

  三、MANIFEST.MF文件

  这个文件是一个描述文件,UTF8编码,大部分内容是固定的,格式化如下:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: www.joymo.cn
MIDlet-1: BookName,/jm.PNG,JavaBook
MIDlet-Vendor: Joymo.cn
MIDlet-Version: 1.0
MIDlet-Name: BookName
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0

 只需修改bookname部分,这样安装后就可以在手机上看到有“bookname”的电子书了。

   了解以上内容后,即便是我们手工生成了以上部分,把JMBook.dat改成JMBook.jar,然后把以上三部分的文件加入到JMBook.jar中,即可以放到手机上安装了。如果是想通过程序的方式实现,这其中的需要注意的地方是二点:

    一、注意内容的编码方式,很多时候我们是GB2312的文本,要注意转换,在VC中可以用MultiByteToWideChar和WideCharToMultiByte进行处理。编码格式的转换可以参考如下代码:

    BYTE utf32_le[]={0xFF,0xFE,0x00,0x00};
    if(memcmp(lpstrInputStream,&utf32_le,4)==0)
        return UTF32_LE;

    BYTE utf32_be[]={0x00,0x00,0xFE,0xFF};
    if(memcmp(lpstrInputStream,&utf32_be,4)==0)
        return UTF32_BE;

    BYTE utf_8[]={0xEF,0xBB,0xBF};
    if(memcmp(lpstrInputStream,&utf_8,3)==0)
        return UTF_8;

    BYTE utf16_le[]={0xFF,0xFE};
    if(memcmp(lpstrInputStream,&utf16_le,2)==0)
        return UTF16_LE;

    BYTE utf16_be[]={0xFE,0xFF};
    if(memcmp(lpstrInputStream,&utf16_be,2)==0)
        return UTF16_BE;
    // Else

    if(IsTextUnicode((void *)lpstrInputStream,iLen,NULL))

        return UTF16_LE;

    二、操作jar文件

    生成的内容最终是要加入到JMBook.dat所对应的jar文件中的,而jar是一种标准的zip文件,有很多开源的代码支持对jar在操作,比如zlib等。

    知道了这两部分的机制后,剩于下的工作其实就很简单了,就是把生成的内容直接压入到jar文件中即可。