Próbuję zrozumieć bajt [] na ciąg znaków, ciąg znaków reprezentujący konwersję bajtu [] na bajt [] ... Przekształcam mój bajt [] na ciąg znaków do wysłania, a następnie oczekuję mojej usługi sieci web (napisanej w python) aby wysłać dane bezpośrednio do klienta.
Kiedy wysyłam dane z mojej aplikacji Java ...
Arrays.toString(data.toByteArray())
Bajty do wysłania ..
[B@405217f8
Send (jest to wynik Arrays.toString (), który powinien być ciągiem reprezentującym moje dane bajtowe, dane te zostaną przesłane przewodem):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Po stronie python serwer python zwraca ciąg wywołujący (który widzę jest taki sam jak ciąg wysłany na serwer
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Serwer powinien zwrócić te dane do klienta, gdzie można je zweryfikować.
Odpowiedź, którą otrzymuje mój klient (jako ciąg), wygląda
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Nie mogę wymyślić, jak przywrócić otrzymany ciąg znaków do bajtu []
Niezależnie od tego, co próbuję, w końcu otrzymuję tablicę bajtów, która wygląda następująco ...
[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]
lub mogę uzyskać reprezentację bajtów, która jest następująca:
B@2a80d889
Oba są inne niż moje przesłane dane ... Jestem pewien, że brakuje mi czegoś naprawdę prostego ....
Jakaś pomoc?!
response
w mojej odpowiedzi, to niestety nie, nie ma innego wyjścia. Najlepszym sposobem byłoby otrzymanie bajtów jako nieprzetworzonych danych (jako plik binarny) zamiast ciągu, a może nawet jako ciąg Base64, co wymagałoby jedynie konwersji go z powrotem jako wartość podstawową 256 (binarną).To wysyła „fajny ciąg” do konsoli.
To jest cholernie łatwe.
źródło
byte[]
on otrzymuje jest reprezentowany jakoString
; tzn ."[97, 98, 99]"
nie[97, 98, 99]
. Oznacza to, że twoja odpowiedź nawet nie dotyczy tej sytuacji.String
dobyte[]
celuString
. Myślę, że pytanie jest wymógbyte[]
, abyString
dobyte[]
.Co ja zrobiłem:
powrót do klientów:
otrzymywać od klientów:
Twoje dane zostaną przesłane w tym formacie:
źródło
Co
Arrays.toString()
robi jest stworzyć reprezentację ciąg każdego bajta w ByteArray.Sprawdź dokumentację API Arrays API
Aby przekonwertować ciąg odpowiedzi z powrotem na oryginalną tablicę bajtów, musisz użyć
split(",")
lub coś i przekształcić go w kolekcję, a następnie przekonwertować każdy pojedynczy element na bajt, aby odtworzyć tablicę bajtów.źródło
Łatwo przekonwertować tablicę bajtów na łańcuch i łańcuch znaków z powrotem na tablicę bajtów w Javie. musimy wiedzieć, kiedy używać „nowego” we właściwy sposób. Można to zrobić w następujący sposób:
konwersja tablicy bajtów na ciąg znaków:
Konwersja ciągów na bajty:
Aby uzyskać więcej informacji, zobacz: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
źródło
Rodzaj danych wyjściowych z tablicy bajtów (
[B@405217f8
) jest również wynikiem tablicy bajtów o zerowej długości (tjnew byte[0]
.). Wygląda na to, że ten ciąg jest odniesieniem do tablicy, a nie opisem zawartości tablicy, tak jak możemy oczekiwać od zwykłej kolekcjitoString()
metodzie .Podobnie jak w przypadku innych respondentów, wskazałbym na
String
konstruktory, które akceptująbyte[]
parametr służący do skonstruowania ciągu z zawartości tablicy bajtów. Powinieneś być w stanie odczytać surowe bajty z gniazd,InputStream
jeśli chcesz uzyskać bajty z połączenia TCP.Jeśli te bajty zostały już odczytane jako
String
(za pomocą anInputStreamReader
), wówczas ciąg można przekonwertować na bajty za pomocągetBytes()
funkcji. Przekaż żądany zestaw znaków zarówno konstruktorowi String, jak igetBytes()
funkcjom, a to zadziała tylko wtedy, gdy dane bajtów mogą zostać przekonwertowane na znaki przezInputStreamReader
.Jeśli chcesz poradzić sobie z surowymi bajtami, naprawdę powinieneś unikać korzystania z tej warstwy czytnika strumienia.
źródło
Czy nie możesz po prostu wysłać bajtów jako bajtów lub przekonwertować każdy bajt na znak i wysłać jako ciąg? Robiąc to tak, jak jesteś, zajmie co najmniej 85 znaków w ciągu, gdy masz tylko 11 bajtów do wysłania. Możesz utworzyć ciąg znaków bajtów, więc będzie to „[B @ 405217f8”, które można łatwo przekonwertować na obiekt
bytes
lubbytearray
w Pythonie. W przeciwnym razie możesz przedstawić je jako ciąg cyfr szesnastkowych („5b42403430353231376638”), zajmujących 22 znaki, które można łatwo rozszyfrować po stronie Pythonabinascii.unhexlify()
.źródło
[B@405217f8
jest identyfikatorem obiektu Java tablicy, a nie zawartością tablicy. Identyfikatora obiektu z pewnością nie można „łatwo przekonwertować na bajt lub obiekt bajtowy w pythonie”. Najlepsze, co możesz zrobić, jeśli chodzi o rozmiar, to konwersja bajtu [] na ciąg base64.[JDK8]
Do ciągu:
Aby bajtować tablicę:
źródło
Jeśli chcesz przekonwertować ciąg znaków z powrotem na tablicę bajtów, musisz użyć
String.getBytes()
(lub równoważnej funkcji Pythona), co pozwoli wydrukować oryginalną tablicę bajtów.źródło
Użyj poniższego kodu API do konwersji kodu bajtowego jako ciągu na tablicę bajtów.
źródło
[JAVA 8]
źródło