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

歡迎訪問 生活随笔!

生活随笔

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

java

Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析

發布時間:2023/12/9 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用環境

前一篇在介紹 JavaStruct 類時指定了使用庫使用環境為 Java 5 及以上,也即開發我們使用的 JDK 版本為1.5及以上就可以了。以下講解的用例可以直接將 code 直接粘貼到 java 的 main 函數中執行就可以了,后面會給出測試用例和結果。

使用方法

JavaStruct 類用于打包和解包結構體,也即使用方法為用該類的 pack 與 unpack 方法將定義的 struct 類轉換為字節流,或者將接收的字節流轉換為我們定義的 struct 類。如下所示為一個簡單的用于檢查結構體類的單元測試方法。結構體成員變量前有一個排序數值,也即注解方式為 ?@StructField(order = 0)?這是因為 Java JVM 規范沒有任何有關類成員排序的說明。使用此方式定義的結構體成員會按照具體實現中使用的order進行成員內存排序,因此每一個結構體成員必須提供一個 order 數值。如下所示:

@StructClass public class Foo {@StructField(order = 0)public byte b;@StructField(order = 1)public int i;}

注意,注解 @StructClass 以及 @StructField 不能省略。結構體定義完成后,使用 pack 與 unpack 方法進行類型轉換,如下所示為完整示例:

public class test {@StructClass public class Foo {@StructField(order = 0)public byte b;@StructField(order = 1)public int i;}public void TestFoo() {try { // Pack the class as a byte buffer Foo f = new Foo();f.b = (byte)1;f.i = 2; byte[] b = JavaStruct.pack(f);for (int i = 0; i < b.length; i++) {System.out.printf("b[%d]: %d\n", i, b[i]);}// Unpack it into an objectFoo f2 = new Foo();JavaStruct.unpack(f2, b);System.out.println("f2.b: " + f2.b);System.out.println("f2.i: " + f2.i);} catch(StructException e) { e.printStackTrace();} }public static void main(String args[]) {test t = new test();t.TestFoo();} }

直接觀察輸出結果:

從輸出結果可以看到,我們定義的結構體被轉換成了 5 個字節的 byte 數組(int 占 4 個字節),可以看出來 int 數據的地字節保存在了 byte 數組的高地址,可見使用 pack 打包時為大端排序。當然,實際應用時我們需要根據需求決定是使用大端還是小端排序。在 pack 與 unpack 方法指定就可以了,具體 pack 默認為大端還是小端排序和處理器架構及編譯器版本都有關系,因此要在項目應用中以真實結果為準。如改成小端:

byte[] b = JavaStruct.pack(f, ByteOrder.LITTLE_ENDIAN);?

如果運行中發生錯誤,結構體操作會拋出 StructException 異常。

Struct 類也可以直接與 Stream 流一起使用??梢詤⒖?Photoshop ACB 文件讀取?example,這里就不作詳細分析了。片段如下:

public void TestACB() {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); }}}

原型相關

對于使用原型,要注意對于 private 與 protected 成員需要用相應的gettersetter 方法。Transient 成員會被自動排除。如下所示:

@StructClass public class PublicPrimitives implements Serializable { @StructField(order = 0) public byte b;@StructField(order = 1)public char c;@StructField(order = 2)public short s;@StructField(order = 3)public int i;@StructField(order = 4)public long lo;@StructField(order = 5)protected float f;@StructField(order = 6)private double d;transient int blah;transient double foo;public float getF() {return f;}public void setF(float f) {this.f = f;}public double getD() {return d;}public void setD(double d) {this.d = d;}public boolean 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);}}

數組相關

使用數組有一些先決條件。當解包時,數組一定要分配充足的空間。只有那些在另一個字段中使用ArrayLengthMarker(見下文) 定義長度的數組可以為 null,這些數組在解包時會自動分配空間。除此之外的數組定義不能為空和未初始化狀態。使用如下所示:

@StructClass public class PublicPrimitiveArrays { @StructField(order = 0) public byte[] b = new byte[5];@StructField(order = 1)public char[] c = new char[10];@StructField(order = 2)public short[] s;@StructField(order = 3)public int[] i;}

數組長度標記相關

數組長度標記(Array Length Markers)對于長度在另一個字段中定義的字段十分有用。參見以下示例,這是個特殊的字符串結構體,其有一個長度字段以及緊跟其后的對應這個長度的 16 位字符。也即結構為:

| Length | UTF-16 Characters ... |

為了處理這種情況,必須把這些字符串表示為一個特殊的結構體類。長度字段應該注解為“ArrayLengthMarker”。通過這種方式,javastruct 可以在打包及解包操作中操作數組字段時自動使用長度字段中的值。示例如下:

@StructClasspublic 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();}}

關于 JavaStruct 應用的文章系列,可以移步至如下鏈接:

1. 《Java 結構體之 JavaStruct 使用教程<一> 初識 JavaStruct

2. 《Java 結構體之 JavaStruct 使用教程<二> JavaStruct 用例分析

3. 《Java 結構體之 JavaStruct 使用教程<三> JavaStruct 數組進階


下載地址:http://download.csdn.net/download/jazzsoldier/9905451

有任何疑問或使用問題可以給我評論或者郵件哦,覺得有用就點贊吧~:-D


創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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