日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaStruct

發布時間:2023/12/8 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaStruct 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、JavaStruct介紹和入門

資源:javastruct.jar:n967(好多地方多需要積分下載,這塊兒直接上貨,感覺好用的評論給我扣個“好”)

javastruct

A library to treat java objects as C structs.

一個將java對象視為C結構的庫


?


?

Project HomeDownloadsWikiIssuesSource


?

HowToUseJavaStruct?

This page explains how to use JavaStruct library.
Featured, Phase-Implementation

Updated Feb 4, 2010 by mda...@gmail.com

201024日更新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網絡協議規范的Java應用程序在處理嵌入式設備和其他應用程序使用C風格的結構

Instead of manually encoding and decoding messages, JavaStruct allows programmers to treat java classes as c structs.

JavaStruct代替了手工編碼和解碼消息,允許程序員把java類當作c結構來對待。

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注釋將類和字段標記為結構。JavaStruct不是第一個嘗試提供結構和功能一樣,-瑪麗?Dautelle Javolution圖書館也有一個優秀的結構實現。而是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類的簡單單元測試方法。Struct字段hasan order value,因為Java JVM規范沒有告訴任何類成員的順序。它們被命令在Sun的實現中出現,但與其他JVM不同。因此每個Struct字段都必須提供一個order值。

@StructClass
publicclassFoo{

???
@StructField(order =0)
???
publicbyte b;

???
@StructField(order =1)
???
publicint i;
}

try{
???
// Pack the class as a byte buffer將類打包為一個字節緩沖區
???
Foo f =newFoo(); //媒體處理器
??? f
.b =(byte)1;
??? f
.i =1;
???
byte[] b =JavaStruct.pack(f);
???
???
// Unpack it into an object把它解壓到一個對象中
???
Foo f2 =newFoo();
???
JavaStruct.unpack(f2, b);
}
catch(StructException e){
}

Struct operations throws a checked StructException if anything goes wrong.

如果出現問題,Struct操作會拋出一個檢查的結構異常。

Struct classes can be used with Streams directly too. Please refer to Photoshop ACB file reader

Struct類也可以直接使用流。請參閱Photoshop ACB文件閱讀器

example.

publicvoid read(String acbFile){
???
try{
???????
FileInputStream fis =newFileInputStream(newFile(acbFile));
??????? header
=newACBHeader();
???????
StructUnpacker up =JavaStruct.getUnpacker(fis,ByteOrder.BIG_ENDIAN);
??????? up
.readObject(header);
...

Primitives

基本體

Using primitives. Note that private and protected fields requires appropriate getter and setter methods. Transient fields are automatically excluded.

使用原語。注意,私有和受保護的字段需要適當的gettersetter方法。瞬態字段被自動排除。

@StructClass
publicclassPublicPrimitivesimplementsSerializable{
???????
@StructField(order =0)
???????
publicbyte b;

???????
@StructField(order =1)
???????
publicchar c;

???????
@StructField(order =2)
???????
publicshort s;

???????
@StructField(order =3)
???????
publicint i;

???????
@StructField(order =4)
???????
publiclong lo;

???????
@StructField(order =5)
???????
protectedfloat f;

???????
@StructField(order =6)
???????
privatedouble d;

???????
transientint blah;// transient短暫的
???????
transientdouble foo;


???????
publicfloat getF(){
???????????????
return f;
???????
}

???????
publicvoid setF(float f){
???????????????
this.f = f;
???????
}

???????
publicdouble getD(){
???????????????
return d;
???????
}

???????
publicvoid setD(double d){
???????????????
this.d = d;
???????
}

???????
publicboolean equals(Object o){
???????????????
PublicPrimitives other =(PublicPrimitives)o;
???????????????
return(this.b == other.b
???????????????????????
&&this.c == other.c
???????????????????????
&&this.s == other.s
???????????????????????
&&this.i == other.i
???????????????????????
&&this.lo == other.lo
???????????????????????
&&this.f == other.f
???????????????????????
&&this.d == other.d);
???????
}
}

Arrays

數組

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.

數組有一些先決條件。當未包裝的時候,應該在數組中保留足夠的空間。只有數組,在另一個字段中使用ArrayLengthMarker(見下部分)的長度定義為空,可以在不打包時自動分配。除此之外,它們不能為零和未初始化。

@StructClass
publicclassPublicPrimitiveArrays{//Primitive ?原始的
???????
@StructField(order =0)
???????
publicbyte[] b =newbyte[5];

???????
@StructField(order =1)
???????
publicchar[] c =newbyte[10];

???????
@StructField(order =2)
???????
publicshort[] s;

???????
@StructField(order =3)
???????
publicint[] i;
}

Array Length Markers

數組長度的標記

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.

數組長度的標記對于那些在她的字段中定義了legth的字段非常有用。考慮下面的例子。這是一個特殊的字符串結構體,它有一個長度字段和16位字符的長度。

? +--------+-----------------------//----------------------------------------+
?
|Length| UTF-16Characters???? \\??????????????????????????????????????? |
?
+--------+-----------------------//----------------------------------------+

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.

為了處理這個問題,我們必須將這些字符串表示為一個特殊的Struct類,比如AStruct。字段長度應標注為“ArrayLengthMarker”。通過這種方式,javastruct可以自動在長度字段中使用值,同時在包裝和解壓縮操作期間處理數組字段。

@StructClass
publicclassAString{
???????
???????
@StructField(order =0)
???????
@ArrayLengthMarker(fieldName ="chars")
???????
publicint length;
???????
???????
@StructField(order =1)
???????
publicchar[] chars;
???????
???????
publicAString(String content){
?????????? ?????
this.length = content.length();
???????????????
this.chars = content.toCharArray();
???????
}
...
}

?

Comment by skossent...@gmail.com, Dec 19, 2011Thanks for this example. But how toread a struct from buffer ?

發表評論skossent…@gmail.com,20111219,謝謝你的這個例子。但是如何從緩沖區中讀取結構體呢?

Comment by cory.d...@gmail.com, Feb 10, 2012Is there anything special thatneeds to be done to allow this to work with 2D arrays?

評論cory.d…@gmail.com,210,2012有什么特殊需要做這允許使用二維數組嗎?

Here is the object that I am trying to pack

這是我想要打包的對象

@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.

這是我得到的運行時錯誤:structexception ?:struct.StructException ?(F)沒有找到任何struct注釋

如果我去掉2D數組,我就不會得到那個例外。

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...

發表評論sender.e…@gmail.com,201326,如果有多個字段結構可變長度。我們如何使用ArrayLengthMarker?在那種情況下?它似乎只能用于一個數據塊,因為它需要構造函數。

二、實戰

java實體類:

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進行java實體類和byte數組的轉化:

NETPRO_INFO netpro_INFO1 = new NETPRO_INFO();JavaStruct.unpack(netpro_INFO1, data2, ByteOrder.LITTLE_ENDIAN); // 由于unpack函數不能將數組按照類的結構轉換大小端,所以用pack來做這個工作。先將錯誤的對象轉化為byte數組(按小端)byte[] pack = JavaStruct.pack(netpro_INFO1,ByteOrder.LITTLE_ENDIAN);NETPRO_INFO netpro_INFO = new NETPRO_INFO(); // 然后將按類結構小端排列的數組unpack成為真確的對象JavaStruct.unpack(netpro_INFO, pack);

總結

以上是生活随笔為你收集整理的JavaStruct的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。