JavaStruct
一、JavaStruct介紹和入門
資源:javastruct.jar:n967(好多地方多需要積分下載,這塊兒直接上貨,感覺好用的評(píng)論給我扣個(gè)“好”)javastruct A library to treat java objects as C structs. 一個(gè)將java對(duì)象視為C結(jié)構(gòu)的庫 | ? ? |
Project HomeDownloadsWikiIssuesSource
? | |
HowToUseJavaStruct? This page explains how to use JavaStruct library. Updated Feb 4, 2010 by mda...@gmail.com 2010年2月4日更新mda…@gmail.com Introduction Struct classes can be used to greatly simplfy network protocol codes of Java applications when working with embedded devices and other applications which uses C style structs. Struct類可用于大大simplfy網(wǎng)絡(luò)協(xié)議規(guī)范的Java應(yīng)用程序在處理嵌入式設(shè)備和其他應(yīng)用程序使用C風(fēng)格的結(jié)構(gòu) Instead of manually encoding and decoding messages, JavaStruct allows programmers to treat java classes as c structs. JavaStruct代替了手工編碼和解碼消息,允許程序員把java類當(dāng)作c結(jié)構(gòu)來對(duì)待。 JavaStruct uses Java 5 annotations to mark Classes and fields as structs. JavaStruct is not the first attempt to provide struct like functionality, Jean-Marie Dautelle's Javolution library also has an excellent struct implementation. But instead of using special classes in Javolution, POJO approach is preferred JavaStruct. JavaStruct使用Java 5注釋將類和字段標(biāo)記為結(jié)構(gòu)。JavaStruct不是第一個(gè)嘗試提供結(jié)構(gòu)和功能一樣,讓-瑪麗?Dautelle Javolution圖書館也有一個(gè)優(yōu)秀的結(jié)構(gòu)實(shí)現(xiàn)。而是Javolution使用特殊類的POJO方法是首選JavaStruct。 General usage JavaStruct fa?ade class is used to pack and unpack struct classes. Below is a simple unit test method for checking a struct class. Struct fields hasan order value, because Java JVM specification does not tell anything about order of the class members. They are ordered as their appearance in Sun's implementation but it differs on other JVM's. So every Struct field has to supply an order value. JavaStruct facade類用于打包和打開struct類。下面是檢查struct類的簡(jiǎn)單單元測(cè)試方法。Struct字段hasan order value,因?yàn)?/span>Java JVM規(guī)范沒有告訴任何類成員的順序。它們被命令在Sun的實(shí)現(xiàn)中出現(xiàn),但與其他JVM不同。因此每個(gè)Struct字段都必須提供一個(gè)order值。 @StructClass Struct operations throws a checked StructException if anything goes wrong. 如果出現(xiàn)問題,Struct操作會(huì)拋出一個(gè)檢查的結(jié)構(gòu)異常。 Struct classes can be used with Streams directly too. Please refer to Photoshop ACB file reader Struct類也可以直接使用流。請(qǐng)參閱Photoshop ACB文件閱讀器 example. publicvoid read(String acbFile){ Primitives 基本體 Using primitives. Note that private and protected fields requires appropriate getter and setter methods. Transient fields are automatically excluded. 使用原語。注意,私有和受保護(hù)的字段需要適當(dāng)?shù)?/span>getter和setter方法。瞬態(tài)字段被自動(dòng)排除。 @StructClass Arrays 數(shù)組 Arrays have some prerequisites. When unpacking, sufficent space should be reserved in the array. Only arrays, whose lengths are defined in another field using ArrayLengthMarker (see below section) can be null, they are automatically allocated while unpacking. Other than that they can not be null and uninitialized. 數(shù)組有一些先決條件。當(dāng)未包裝的時(shí)候,應(yīng)該在數(shù)組中保留足夠的空間。只有數(shù)組,在另一個(gè)字段中使用ArrayLengthMarker(見下部分)的長(zhǎng)度定義為空,可以在不打包時(shí)自動(dòng)分配。除此之外,它們不能為零和未初始化。 @StructClass Array Length Markers 數(shù)組長(zhǎng)度的標(biāo)記 Array length markers are very useful for the fields whose legth is defined in anoher field. consider the following example. This is a special String struct which has a length fields and length number of 16 bit characters following it. 數(shù)組長(zhǎng)度的標(biāo)記對(duì)于那些在她的字段中定義了legth的字段非常有用。考慮下面的例子。這是一個(gè)特殊的字符串結(jié)構(gòu)體,它有一個(gè)長(zhǎng)度字段和16位字符的長(zhǎng)度。 ? +--------+-----------------------//----------------------------------------+ In order to process this, we have to represent these strings as a special Struct class, lets say AStruct. The length field should be annotated as "ArrayLengthMarker". This way javastruct can automatically use the value in length field while processing the array field during packing and unpacking operations. 為了處理這個(gè)問題,我們必須將這些字符串表示為一個(gè)特殊的Struct類,比如AStruct。字段長(zhǎng)度應(yīng)標(biāo)注為“ArrayLengthMarker”。通過這種方式,javastruct可以自動(dòng)在長(zhǎng)度字段中使用值,同時(shí)在包裝和解壓縮操作期間處理數(shù)組字段。 @StructClass ? | |
Comment by skossent...@gmail.com, Dec 19, 2011Thanks for this example. But how toread a struct from buffer ?
發(fā)表評(píng)論skossent…@gmail.com,2011年12月19日,謝謝你的這個(gè)例子。但是如何從緩沖區(qū)中讀取結(jié)構(gòu)體呢?
Comment by cory.d...@gmail.com, Feb 10, 2012Is there anything special thatneeds to be done to allow this to work with 2D arrays?
評(píng)論cory.d…@gmail.com,2月10日,2012有什么特殊需要做這允許使用二維數(shù)組嗎?
Here is the object that I am trying to pack、
這是我想要打包的對(duì)象
@StructClass
publicclassSEND_DATA_STRUCTURE
{
??? @StructField(order =0)
??? publicfloatgyro_offset[]=newfloat[3];
??
??? @StructField(order =1)
??? publicfloataccel_offset[]=newfloat[3];
???
??? @StructField(order =2)
??? publicfloatMagCalRotationMat[][]=newfloat[3][3];
???
??? @StructField(order =3)
??? publicfloatMagCalScaleMat[][]=newfloat[3][3];
???
??? @StructField(order =4)
??? publicfloatMagCalShiftMat[][]=newfloat[1][3];
}?
?
Here is the code I'm using to pack it:
這是我使用的代碼包
byte[] b;
SEND_DATA_STRUCTURE txData =newSEND_DATA_STRUCTURE();
b =JavaStruct.pack(txData,ByteOrder.LITTLE_ENDIAN);
and this is the runtime error that I get:struct.StructException?: struct.StructException?: No struct Annotation found for [F
If I get rid of the 2D arrays, I don't get that exception.
這是我得到的運(yùn)行時(shí)錯(cuò)誤:structexception ?:struct.StructException ?(F)沒有找到任何struct注釋
如果我去掉2D數(shù)組,我就不會(huì)得到那個(gè)例外。
Comment by sender.e...@gmail.com, Feb 6, 2013What if thereare multiple fields in the struct that can be variable length. How do we useArrayLengthMarker? in that situation? It seems like it can only be used for onechunk of data since it requires the constructor...
發(fā)表評(píng)論sender.e…@gmail.com,2013年2月6日,如果有多個(gè)字段結(jié)構(gòu)可變長(zhǎng)度。我們?nèi)绾问褂?/span>ArrayLengthMarker嗎?在那種情況下?它似乎只能用于一個(gè)數(shù)據(jù)塊,因?yàn)樗枰獦?gòu)造函數(shù)。
二、實(shí)戰(zhàn)
java實(shí)體類:
package JKWR.POJO;import java.util.Arrays;import struct.StructClass; import struct.StructField;@StructClass public class NETPRO_INFO {@StructField(order = 0)int probe_id;@StructField(order = 1)int pad;@StructField(order = 2)int cmd_type;@StructField(order = 3)int cmd_length;@StructField(order = 4)byte[] ip = new byte[4];@StructField(order = 5)byte[] mask = new byte[4];@StructField(order = 6)byte[] gateway = new byte[4];@StructField(order = 7)byte[] dns = new byte[4];@StructField(order = 8)byte[] manage_center_ip = new byte[4];@StructField(order = 9)int manage_center_port;@StructField(order = 10)byte[] redis_ip = new byte[4];@StructField(order = 11)int redis_port;@StructField(order = 12)byte[] analyze_center_ip = new byte[4];@StructField(order = 13)int analyze_center_port;@StructField(order = 14)byte[] syslog_first_ip = new byte[4];@StructField(order = 15)int syslog_first_port;@StructField(order = 16)byte[] syslog_second_ip = new byte[4];@StructField(order = 17)int syslog_second_port;@StructField(order = 18)byte[] kafka_first_ip = new byte[4];@StructField(order = 19)int kafka_first_port;@StructField(order = 20)byte[] kafka_second_ip = new byte[4];@StructField(order = 21)int kafka_second_port;@StructField(order = 22)int run_time;@StructField(order = 23)int active_time;@StructField(order = 24)int cpu;@StructField(order = 25)int cpu_used;@StructField(order = 26)int mem;@StructField(order = 27)int mem_used;@StructField(order = 28)int disk;@StructField(order = 29)int disk_used;@StructField(order = 30)int port_number;@StructField(order = 31)int output_mode;@StructField(order = 32)byte[] probe_seq = new byte[16];@StructField(order = 33)int[] port = new int[20];@StructField(order = 34)int[] link_id = new int[20];public int getProbe_id() {return probe_id;}public void setProbe_id(int probe_id) {this.probe_id = probe_id;}public int getPad() {return pad;}public void setPad(int pad) {this.pad = pad;}public int getCmd_type() {return cmd_type;}public void setCmd_type(int cmd_type) {this.cmd_type = cmd_type;}public int getCmd_length() {return cmd_length;}public void setCmd_length(int cmd_length) {this.cmd_length = cmd_length;}public byte[] getIp() {return ip;}public void setIp(byte[] ip) {this.ip = ip;}public byte[] getMask() {return mask;}public void setMask(byte[] mask) {this.mask = mask;}public byte[] getGateway() {return gateway;}public void setGateway(byte[] gateway) {this.gateway = gateway;}public byte[] getDns() {return dns;}public void setDns(byte[] dns) {this.dns = dns;}public byte[] getManage_center_ip() {return manage_center_ip;}public void setManage_center_ip(byte[] manage_center_ip) {this.manage_center_ip = manage_center_ip;}public int getManage_center_port() {return manage_center_port;}public void setManage_center_port(int manage_center_port) {this.manage_center_port = manage_center_port;}public byte[] getRedis_ip() {return redis_ip;}public void setRedis_ip(byte[] redis_ip) {this.redis_ip = redis_ip;}public int getRedis_port() {return redis_port;}public void setRedis_port(int redis_port) {this.redis_port = redis_port;}public byte[] getAnalyze_center_ip() {return analyze_center_ip;}public void setAnalyze_center_ip(byte[] analyze_center_ip) {this.analyze_center_ip = analyze_center_ip;}public int getAnalyze_center_port() {return analyze_center_port;}public void setAnalyze_center_port(int analyze_center_port) {this.analyze_center_port = analyze_center_port;}public byte[] getSyslog_first_ip() {return syslog_first_ip;}public void setSyslog_first_ip(byte[] syslog_first_ip) {this.syslog_first_ip = syslog_first_ip;}public int getSyslog_first_port() {return syslog_first_port;}public void setSyslog_first_port(int syslog_first_port) {this.syslog_first_port = syslog_first_port;}public byte[] getSyslog_second_ip() {return syslog_second_ip;}public void setSyslog_second_ip(byte[] syslog_second_ip) {this.syslog_second_ip = syslog_second_ip;}public int getSyslog_second_port() {return syslog_second_port;}public void setSyslog_second_port(int syslog_second_port) {this.syslog_second_port = syslog_second_port;}public byte[] getKafka_first_ip() {return kafka_first_ip;}public void setKafka_first_ip(byte[] kafka_first_ip) {this.kafka_first_ip = kafka_first_ip;}public int getKafka_first_port() {return kafka_first_port;}public void setKafka_first_port(int kafka_first_port) {this.kafka_first_port = kafka_first_port;}public byte[] getKafka_second_ip() {return kafka_second_ip;}public void setKafka_second_ip(byte[] kafka_second_ip) {this.kafka_second_ip = kafka_second_ip;}public int getKafka_second_port() {return kafka_second_port;}public void setKafka_second_port(int kafka_second_port) {this.kafka_second_port = kafka_second_port;}public int getRun_time() {return run_time;}public void setRun_time(int run_time) {this.run_time = run_time;}public int getActive_time() {return active_time;}public void setActive_time(int active_time) {this.active_time = active_time;}public int getCpu() {return cpu;}public void setCpu(int cpu) {this.cpu = cpu;}public int getCpu_used() {return cpu_used;}public void setCpu_used(int cpu_used) {this.cpu_used = cpu_used;}public int getMem() {return mem;}public void setMem(int mem) {this.mem = mem;}public int getMem_used() {return mem_used;}public void setMem_used(int mem_used) {this.mem_used = mem_used;}public int getDisk() {return disk;}public void setDisk(int disk) {this.disk = disk;}public int getDisk_used() {return disk_used;}public void setDisk_used(int disk_used) {this.disk_used = disk_used;}public int getPort_number() {return port_number;}public void setPort_number(int port_number) {this.port_number = port_number;}public int getOutput_mode() {return output_mode;}public void setOutput_mode(int output_mode) {this.output_mode = output_mode;}public byte[] getProbe_seq() {return probe_seq;}public void setProbe_seq(byte[] probe_seq) {this.probe_seq = probe_seq;}public int[] getPort() {return port;}public void setPort(int[] port) {this.port = port;}public int[] getLink_id() {return link_id;}public void setLink_id(int[] link_id) {this.link_id = link_id;}@Overridepublic String toString() {return "NETPRO_INFO [probe_id=" + probe_id + ", pad=" + pad+ ", cmd_type=" + cmd_type + ", cmd_length=" + cmd_length+ ", ip=" + Arrays.toString(ip) + ", mask="+ Arrays.toString(mask) + ", gateway="+ Arrays.toString(gateway) + ", dns=" + Arrays.toString(dns)+ ", manage_center_ip=" + Arrays.toString(manage_center_ip)+ ", manage_center_port=" + manage_center_port + ", redis_ip="+ Arrays.toString(redis_ip) + ", redis_port=" + redis_port+ ", analyze_center_ip=" + Arrays.toString(analyze_center_ip)+ ", analyze_center_port=" + analyze_center_port+ ", syslog_first_ip=" + Arrays.toString(syslog_first_ip)+ ", syslog_first_port=" + syslog_first_port+ ", syslog_second_ip=" + Arrays.toString(syslog_second_ip)+ ", syslog_second_port=" + syslog_second_port+ ", kafka_first_ip=" + Arrays.toString(kafka_first_ip)+ ", kafka_first_port=" + kafka_first_port+ ", kafka_second_ip=" + Arrays.toString(kafka_second_ip)+ ", kafka_second_port=" + kafka_second_port + ", run_time="+ run_time + ", active_time=" + active_time + ", cpu=" + cpu+ ", cpu_used=" + cpu_used + ", mem=" + mem + ", mem_used="+ mem_used + ", disk=" + disk + ", disk_used=" + disk_used+ ", port_number=" + port_number + ", output_mode="+ output_mode + ", probe_seq=" + Arrays.toString(probe_seq)+ ", port=" + Arrays.toString(port) + ", link_id="+ Arrays.toString(link_id) + "]";}}通過javaStruct進(jìn)行java實(shí)體類和byte數(shù)組的轉(zhuǎn)化:
NETPRO_INFO netpro_INFO1 = new NETPRO_INFO();JavaStruct.unpack(netpro_INFO1, data2, ByteOrder.LITTLE_ENDIAN); // 由于unpack函數(shù)不能將數(shù)組按照類的結(jié)構(gòu)轉(zhuǎn)換大小端,所以用pack來做這個(gè)工作。先將錯(cuò)誤的對(duì)象轉(zhuǎn)化為byte數(shù)組(按小端)byte[] pack = JavaStruct.pack(netpro_INFO1,ByteOrder.LITTLE_ENDIAN);NETPRO_INFO netpro_INFO = new NETPRO_INFO(); // 然后將按類結(jié)構(gòu)小端排列的數(shù)組unpack成為真確的對(duì)象JavaStruct.unpack(netpro_INFO, pack);總結(jié)
以上是生活随笔為你收集整理的JavaStruct的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struct结构体的多种声明方式
- 下一篇: Java Network Program