Bir byte[]'dan string'e, byte[]'dan byte[]'a dönüşümün string gösterimini anlamaya çalışıyorum... Göndermek için byte[]'ımı bir dizeye dönüştürüyorum, daha sonra web hizmetimin (python'da yazılmış) verileri doğrudan istemciye geri yankılamasını bekliyorum.
Java uygulamamdan veri gönderdiğimde...
Arrays.toString(data.toByteArray())
Gönderilecek baytlar..
[B@405217f8
Send (Bu, bayt verilerimin bir dize gösterimi olması gereken Arrays.toString() işleminin sonucudur, bu veriler kablo üzerinden gönderilecektir):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Python tarafında, python sunucusu arayan kişiye bir dize döndürüyor (sunucuya gönderdiğim dizeyle aynı olduğunu görebiliyorum
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Sunucu bu veriyi doğrulanabileceği istemciye geri göndermelidir.
İstemcimin aldığı yanıt (bir dize olarak) şöyle görünür
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Alınan dizeyi bir dizeye nasıl geri getireceğimi bulamıyorum byte[]
Ne denersem deneyeyim, sonunda aşağıdaki gibi görünen bir bayt dizisi elde ediyorum...
[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]
ya da aşağıdaki gibi bir bayt gösterimi elde edebilirim:
B@2a80d889
Bunların her ikisi de benim gönderdiğim verilerden farklı... Eminim gerçekten basit bir şeyi kaçırıyorum....
Yardım eder misin?!
Dönen dizeyi alıp ondan bir dize oluşturamazsınız... bu artık bir byte[]
veri türü değildir, zaten bir dizedir; onu ayrıştırmanız gerekir. Örneğin:
String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]"; // response from the Python script
String[] byteValues = response.substring(1, response.length() - 1).split(",");
byte[] bytes = new byte[byteValues.length];
for (int i=0, len=bytes.length; i<len; i++) {
bytes[i] = Byte.parseByte(byteValues[i].trim());
}
String str = new String(bytes);
EDIT
Sorunuzda, "Ne denersem deneyeyim, sonunda aşağıdaki gibi görünen bir bayt dizisi elde ediyorum...' dediğiniz yerde sorununuz hakkında bir ipucu elde edersiniz. [91, 45, ...
" çünkü 91
, [
için bayt değeridir, bu nedenle [91, 45, ...
, "[-45, 1, 16, ...
" dizesinin bayt dizisidir.
Arrays.toString()yöntemi, belirtilen dizinin
String` gösterimini döndürür; yani döndürülen değer artık bir dizi olmayacaktır. Örneğin:
byte[] b1 = new byte[] {97, 98, 99};
String s1 = Arrays.toString(b1);
String s2 = new String(b1);
System.out.println(s1); // -> "[97, 98, 99]"
System.out.println(s2); // -> "abc";
Gördüğünüz gibi, s1
b1
dizisinin dize gösterimini tutarken, s2
b1
içinde bulunan baytların dize gösterimini tutar.
Şimdi, sizin sorununuzda, sunucunuz s1
e benzer bir dize döndürür, bu nedenle dizi temsilini geri almak için ters kurucu yöntemine ihtiyacınız vardır. Eğer s2.getBytes()
, new String(b1)
in tersi ise, Arrays.toString(b1)
in tersini bulmanız gerekir, dolayısıyla bu yanıtın ilk parçasına yapıştırdığım kod.
Arrays.toString()`in yaptığı şey, byteArray'inizdeki her bir baytın bir dize temsilini oluşturmaktır.
Lütfen API belgelerini kontrol edin Diziler API
Yanıt dizenizi orijinal bayt dizisine geri dönüştürmek için, split(",")
veya başka bir şey kullanmanız ve bunu bir koleksiyona dönüştürmeniz ve ardından bayt dizinizi yeniden oluşturmak için buradaki her bir öğeyi bir bayta dönüştürmeniz gerekir.
Baytları sadece bayt olarak gönderemez misiniz veya her baytı bir karaktere dönüştürüp bir dize olarak gönderemez misiniz? Gönderilecek yalnızca 11 baytınız varken, sizin yaptığınız gibi yapmak dizede en az 85 karakter kaplayacaktır. Baytların bir dizge gösterimini oluşturabilirsiniz, böylece "[B@405217f8" olur, bu da Python'da kolayca bir bytes
veya bytearray
nesnesine dönüştürülebilir. Bunu yapamazsanız, bunları 22 karakterden oluşan bir dizi onaltılık basamak ("5b42403430353231376638") olarak gösterebilirsiniz, bu da Python tarafında binascii.unhexlify()
kullanılarak kolayca çözülebilir.