暗号化してから文字列に変換して送信できるようにするバイト配列があります。文字列を受け取ったら、文字列をバイト配列に変換して、復号化できるようにする必要があります。受信した文字列が送信した文字列(長さを含む)と一致することを確認しましたが、str.getBytes()などを使用してバイト配列に変換すると、元のバイト配列と一致しません。
出力例:
SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [B@3e4a9a7d
RECEIVED STR: [B@3e4a9a7d
RECEIVED: W0JAM2U0YTlhN2Q=
受信した文字列を送信したバイト配列と一致するバイト配列に変換する方法はありますか?
ありがとう
次のように実装されているarray.toString()
を使用しました。
_return "[B@" + Integer.toString(this.hashCode(), 16);
_
(実際にはObjectから定義を継承しており、_@
_の前の部分は単にgetClass().getName()
の結果です。)
そして、ここのhashCodeはコンテンツに依存しません。
代わりに、新しいString(array、encoding)を使用してください。
もちろん、これは、任意の配列ではなく、Java文字列(その後、読み取り可能な文字を含む)として実際に表現できるバイト配列でのみ機能します。Bozhoのようなbase64の使用をお勧めします(ただし、チャネルの両側で使用する場合)。
これはBase64のように見えます。 commons-codecBase64
クラスを見てください。
GetBytesはプラットフォームのデフォルトの文字セットを使用するため、2つの異なるマシンでgetBytes()を使用することはできません。
指定した文字セット(UTF-8など)で配列をデコードおよびエンコードして、正しい結果が得られることを確認します。
まず、バイト配列を適切な文字列に変換します。
String line= new String(Arrays.toString(your_array))
次に、それを送信し、以下の関数を使用します
public static byte[] StringToByteArray(String line)
{
String some=line.substring(1, line.length()-1);
int element_counter=1;
for(int i=0; i<some.length(); i++)
{
if (some.substring(i, i+1).equals(","))
{
element_counter++;
}
}
int [] comas =new int[element_counter-1];
byte [] a=new byte[element_counter];
if (a.length==1)
{
a[0]= Byte.parseByte(some.substring(0));
}
else
{
int j=0;
for (int i = 0; i < some.length(); i++)
{
if (some.substring(i, i+1).equals(","))
{
comas[j]=i;
j++;
}
}
for (int i=0; i<element_counter; i++)
{
if(i==0)
{
a[i]=Byte.parseByte(some.substring(0, comas[i]));
}
else if (i==element_counter-1)
{
a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2));
}
else
{
a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i]));
}
}
}
return a;
}