javaStruct - 通讯协议的解封包第三方库--(二)官方文档三
原文链接
https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wiki
翻译用工具
翻译使用的是个人免费版Transmate
译文
如何使用JavaStruct读写Adobe Photoshop Color book文件
JavaStruct对于读写特定的二进制文件也是非常理想的。在这个例子中,我们将写一个 Photoshop Color book 文件读写器。这种文件格式的细节可在这里找到。
完整的代码请到:http://javastruct.googlecode.com/svn/trunk/javastruct/samples/photoshop/
备注:我注意到使用一个nio ByteBuffer写这样一个读写器并不是非常困难(可能更短)。但是JavaStruct提供了更清晰,可维护性更好的代码。并且如果有许多的二进制文件或消息,处理解封包将是非常容易引入错误的。
文件头
在头部,有一个特定的字符串字段. ±-------±----------------------//----------------------------------------+ | Length | UTF-16 Characters \ | ±-------±----------------------//----------------------------------------+
这样首先我们需要将这些字符串用一个特别的结构类表示,姑且叫 A 结构体。我们使用数组长度标记来声明。
@StructClass
public class AString { @StructField (order = 0 ) @ArrayLengthMarker (fieldName = "chars") public int length; @StructField (order = 1) public char[] chars;public AString(String content){ this.length = content.length(); this.chars = content.toCharArray(); } ...
}
下面是实际的头。
@StructClass
public class ACBHeader { public static final short RGB = 0; public static final short CMYK = 2; public static final short LAB = 7; // 签名通常是ASCII字符串“8BCB"@StructField (order = 0) public byte[] signature = {'8', 'B', 'C', 'B'}; //Photoshop 7 仅打开版本为1(0x0001)的文件@StructField (order = 1) public short fileVersion; // 唯一识别符@StructField (order = 2) public short colorBookIdentifier; @StructField (order = 3) public AString title; @StructField (order = 4) public AString colorNamePrefix; @StructField (order = 5) public AString colorNamePostfix; // 通常是一个版权声明@StructField (order = 6) public AString description; @StructField (order = 7) public short colorCount; // Photoshop 每页显示颜色数.这个字段指定了// 能够在一个页面上显示的颜色的最大数量. @StructField (order = 8) public short colorsPerPage; @StructField (order = 9) public short pageSelectorOffset; // RGB, CMYK or Lab @StructField (order = 10) public short colorSpaceID; ...
读取颜色
这里是比较棘手的部分。通过格式化,颜色值和它的格式是依赖于 colorSpaceID 字段。其可以是RGB,CMYK或者Lab。这样我们对每一个颜色域写一个类。这里有颜色数据的”colorCount"数量值。
@StructClass
public class RGBColor{ @StructField (order = 0) public AString name; @StructField (order = 1) public byte[] code = new byte[6]; @StructField (order = 2) public byte red; @StructField (order = 3) public byte green; @StructField (order = 4) public byte blue; ...
} @StructClass
public class LabColor { @StructField (order = 0) public AString name; @StructField (order = 1) public byte[] code = new byte[6]; @StructField (order = 2) public byte lightness; @StructField (order = 3) public byte aChrom; @StructField (order = 4) public byte bChrom; ...
}
注意对于每个颜色类都包含名字和编码字段。这是必要的,因为当前结构体类并不是从一个结构体基类派生的。
读写器
为了读和写acb文件,我们初始化了包含FileStream的StructPacker和StructUnpacker类。之后,读文件头和颜色值就直截了当。
public class AdobeColorBook { ACBHeader header;RGBColor[] rgbColors = null; CMYKColor[] cmykColors = null; LabColor[] labColors = null; public void read(String acbFile){ try { FileInputStream fis = new FileInputStream(new File(acbFile)); header = new ACBHeader(); StructUnpacker up = JavaStruct.getUnpacker(fis, ByteOrder.BIG_ENDIAN); up.readObject(header); switch(header.ColorSpaceID){ case ACBHeader.RGB : rgbColors = new RGBColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ rgbColors[i] = new RGBColor(); up.readObject(rgbColors[i]); } break; case ACBHeader.CMYK : cmykColors = new CMYKColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ cmykColors[i] = new CMYKColor(); up.readObject(cmykColors[i]); } break; case ACBHeader.LAB : labColors = new LabColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ labColors[i] = new LabColor(); up.readObject(labColors[i]); } break; default: } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (StructException e) { e.printStackTrace(); } } public void write(String name){ try{ FileOutputStream fo = new FileOutputStream(new File(name)); StructPacker packer = JavaStruct.getPacker(fo, ByteOrder.BIG_ENDIAN); packer.writeObject(header); switch(header.ColorSpaceID){ case ACBHeader.RGB : for(RGBColor color : rgbColors){ packer.writeObject(color); } break; case ACBHeader.CMYK : for(CMYKColor color : cmykColors){ packer.writeObject(color); } break; case ACBHeader.LAB : for(LabColor color : labColors){ packer.writeObject(color); } break; default: } fo.close(); } catch(StructException e){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String toString(){ String str = ""; if (header != null){ str += header; } switch(header.ColorSpaceID){ case ACBHeader.RGB : for(RGBColor color : rgbColors) { str += color + "\n"; } break; case ACBHeader.CMYK : for(CMYKColor color : cmykColors) { str += color + "\n"; } break; case ACBHeader.LAB : for(LabColor color : labColors) { str += color + "\n"; } break; } return str; } public static void main(String[] args) { AdobeColorBook anpaBook = new AdobeColorBook(); anpaBook.read("ANPA Color.acb"); anpaBook.write("ANPA_my_Color.acb"); System.out.println(anpaBook); }
}
javaStruct - 通讯协议的解封包第三方库--(二)官方文档三相关推荐
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档二
原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 简介 当与嵌入式设备和其他使用C语言样 ...
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档一
原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...
- python数据科学和机器学习常用库的官方文档
文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...
- python 笔记 :Gym库 (官方文档笔记)
Gym是一个开发和比较强化学习算法的工具箱.它不依赖强化学习算法结构,并且可以使用很多方法对它进行调用. 1 Gym环境 这是一个让某种小游戏运行的简单例子. 这将运行 CartPole-v0 环境实 ...
- 【清单】语言、框架及库的官方文档、examples、tutorials
spark:Quick Start tensorflow: 官方文档中文版:介绍 | TensorFlow 官方文档中文版 tutorials:Get Started with TensorFlow
- Poco 库开发-教你如何读Poco的官方文档
引言 在使用任何一种框架开发的时候,都不免要阅读官方的文档. 下面就讲述如何来读Poco库的官方文档 Poco库 在我们下载好Poco 后,会有两个文件夹,一个是放文档的doc,另外一个就是代码了,这 ...
- 如何快速一次性卸载所有python包(第三方库)呢
这篇文章主要介绍了如何快速一次性卸载所有python包(第三方库)呢,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 很多时候我们 ...
- 官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)
Core Graphics Quartz 2D Programming Guide Core Graphics (Framework) Drawing(UIKit).Images and PDF(UI ...
- 【pytest官方文档】解读- 开发可pip安装的第三方插件
在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...
最新文章
- 2015级C++第14周实践项目 模板
- 机器学习可解释性工具箱XAI
- Head First Design Pattern
- python随机画散点图-python散点图实例之随机漫步
- 在EF中使用SQL执行简单高效的增删查操作
- Catalina.stop: Connect refused解决过程
- Mac 下安装 Python-OpenCV Python-OpenCV 处理图像(一):基本操作
- 拒绝“肌肉记忆”,卡萨帝迈进场景品牌新赛道
- 面向对象编程——获取对象信息(五)
- lrange是取出所有值并移除么_部落冲突:兵营容量提升,移除超级部队、英雄防御状态冷却时间...
- 交叉调试 arm linux,搭建交叉调试环境Arm-Linux-Gdb与gdbserver
- 【codevs2287】火车站,第一个A掉的钻石题(迟来的解题报告)
- 03-neo4j的命令
- sql创建表主键gui_在SQL Server中使用主数据服务快速创建最终用户可以维护的GUI
- 静态页面评论处理以及列表处理
- C++中编译速度与平时代码规范
- 应用程序图标丢失快捷方式没有图标怎么办
- macd底背离的python_Python量化交易之MACD#39;顶底背离#39;形态的实现,自动化交易!...
- 为什么易语言程序被360和windows安全中心认作是病毒?
- 数据科学 案例7 决策树之电脑购买(代码)
热门文章
- 【操作系统之哲学导论】内存原理篇
- ewma 指数加权平均
- mavenproject1-1.0-SNAPSHOT.jar中没有主清单属性——修改MANIFEST.MF
- 帷幄前沿茶话丨如何发起一场直播间运营变革?
- java 回车换行替换_java中替换字符以及回车换行
- 圣诞节送什么礼物好?高颜值耐用的蓝牙耳机推荐
- Mybatis-Plus的介绍和使用
- TC Disrupt San Francisco 2011冠军出炉,Shaker问鼎
- 多位中青年科研人员早逝!985教授:不要拿生命做研究...
- Android系统中app包名、activity名汇总