3

バイナリ形式 ( hex: 80 3b c8 87 0a 89) のデータがあり、Jackcess を介して MS Access db にバイナリ データを保存するために、それを文字列に変換する必要があります。JavaでバイナリデータにStringを使用するつもりはないことはわかっていますが、Access dbはサードパーティ製品であり、まったく制御していません。

そこでバイナリデータに変換して保存しようとしたのですが、残念ながら予想外の結果でした。

byte[] byteArray = new byte[] {0x80, 0x3b, 0xc8, 0x87, 0x0a 0x89};
System.out.println(String.format("%02X ",byteArray[0])+String.format("%02X ", byteArray[1]));//gives me the same values

String value = new String(byteArray, "UTF-8");//or any other encoding
System.out.println(value);//completely different values

new String何が起こっているのか、バイナリデータを文字列に変換して同じ16進値を持つ方法があるかどうかを知りたいです。

注 1 : 最初に、16 進数とは関係のないバイナリ ファイルを読みました。データセットの比較のためだけに 16 進数を使用します。

注2 Base64、別名MIME、UTF-7などを使用する提案がありました。私の理解では、バイナリデータを取得してANSI文字セットにエンコードし、基本的に初期データを微調整します。ただし、バイナリ配列に保持している正確なデータを書き込む必要があるため、これは解決策ではありません。

byte[] byteArray = new byte[]{0x2f, 0x7a, 0x2d, 0x28};
byte[]   bytesEncoded = Base64.encodeBase64(byteArray);
System.out.println("encoded value is " + new String(bytesEncoded ));//new data
4

2 に答える 2

4

任意のバイナリ データを安全にテキストに変換するには、hex や base64 などを使用する必要があります。UTF-8 などのエンコーディングは、任意のテキストデータをバイトとしてエンコードするためのものであり、任意のバイナリデータをテキストとしてエンコードするためのものではありません。ソースデータが何であるかという点での違いです。

これにはライブラリを使用することを強くお勧めします。たとえば、Guavaの場合:

String hex = BaseEncoding.base16().encode(byteArray);
// Store hex in the database in the text field...
...
// Get hex from the database from the text field...
byte[] binary = BaseEncoding.base16().decode(hex);

(もちろん、Apache Commons Codec などの他のライブラリも利用できます。)

または、バイナリ データをテキストに変換するのではなく、バイナリ データ用に設計された Access のフィールドに保存します。

于 2015-01-30T10:29:09.243 に答える