一種C#生成符合Java規則的二進制文件方法

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/java

1.一個項目中的真實問題

實際項目中,本想經過C#製做小工具生成SHP的二進制空間索引文件,而後java服務端解析該空間索引文件進行使用。數組

在真實使用中發現java端解析的該文件內容與C#寫入的差異很是大,好比java中解析到的double均爲很是大的負數。微信

                       

2.排查問題

2.1 測試是否C#寫入有誤

 

檢查寫入的值在C#中解譯爲正確。工具

2.2 編碼錯誤

用java生成相同的文件,編碼與C#生成文件的編碼同樣,可是內容不同,因此自己不是編碼錯誤致使。測試

 

2.3 總結

推斷出,錯位緣由爲C#寫入的值和Java寫入的值不同。編碼

3.錯誤緣由

a.C#中byte範圍是[0,255],而Java中的byte範圍是[-128,127]。3d

b.C#中的字節排序爲低端排序,可是Java中的字節排序爲高端排序。好比double值在java中是如此存儲的:writes that long value to the underlying output stream as an 8-byte quantity, high byte first。blog

4.解決思路

4.1 描述

利用C#中的sbyte[-128,127],將C#中存入的byte數組進行倒置,而後再將各byte準換至sbyte,最後總體存入該sbyte數組。排序

4.2 具體實現代碼

 

5.結果驗證

C#中寫入:索引

 

Java中讀取:

 

 

結果一致。

6.關於寫入string的問題

你們若是用C#將string變成二進制寫入到文件中時,會發現Java寫入相同的string值生成的文件大小比C#的小,這是爲何呢?

查看Java中寫入string二進制的說明:Writes the string to the file as a sequence of bytes. Each character in the string is written out, in sequence, by discarding its high eight bits。

可見其寫入的字符,默認爲ANSI編碼,即只有一個字節,同時其字節排序仍然是高位排序。發現這點後,咱們能夠對C#中寫入字符串進行重寫:

 

                                                                       -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                           若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                          

相關文章
相關標籤/搜索