바이트[]를 문자열로, 바이트[]를 바이트[]로 변환하는 문자열 표현을 이해하려고합니다.... 바이트[]를 문자열로 변환하여 전송 한 다음 웹 서비스 (파이썬으로 작성)가 데이터를 클라이언트에 바로 반향 할 것으로 기대합니다.
Java 애플리케이션에서 데이터를 전송할 때...
Arrays.toString(data.toByteArray())
전송할 바이트...
[B@405217f8
보내기(이것은 내 바이트 데이터의 문자열 표현이어야 하는 Arrays.toString()의 결과이며, 이 데이터는 와이어를 통해 전송됩니다):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
파이썬 측에서, 파이썬 서버는 호출자에게 문자열을 반환합니다(제가 서버에 보낸 문자열과 동일한 것을 볼 수 있습니다.
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
서버는 이 데이터를 클라이언트에 반환하여 확인할 수 있도록 해야 합니다.
클라이언트가 받는 응답(문자열)은 다음과 같습니다.
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
수신 된 문자열을 다시 바이트[]
내가 시도하는 것처럼 보이는 것은 다음과 같은 바이트 배열을 얻는 것입니다...
[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]
또는 다음과 같은 바이트 표현을 얻을 수 있습니다:
B@2a80d889
이 두 가지 모두 내가 보낸 데이터와 다릅니다 ... 내가 정말 간단한 것을 놓친 것 같아요....
어떤 도움이라도?!
반환된 문자열을 그냥 가져와서 문자열을 만들 수는 없습니다. 더 이상 byte[]
데이터 유형이 아니라 이미 문자열이므로 구문 분석해야 합니다. 예를 들어:
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
질문에서 문제의 힌트를 얻을 수 있는데, 내가 시도하는 것처럼 보이는 것은 결국 다음과 같은 바이트 배열을 얻습니다...
라고 말합니다. [91, 45, ...",
91은
[의 바이트 값이므로
[91, 45, ...은 문자열 "[-45, 1, 16, ...
" 문자열의 바이트 배열입니다.
메서드 Arrays.toString()
은 지정된 배열의 String
표현을 반환합니다. 즉, 반환된 값은 더 이상 배열이 아닙니다. 예를 들어:
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";
보시다시피, s1
은 배열 b1
의 문자열 표현을 담고 있고, s2
는 b1
에 포함된 바이트의 문자열 표현을 담고 있습니다.
이제 귀하의 문제에서 서버는 s1
과 유사한 문자열을 반환하므로 배열 표현을 다시 가져 오려면 반대 생성자 메서드가 필요합니다. s2.getBytes()가
new String(b1)의 반대인 경우
Arrays.toString(b1)`의 반대를 찾아야 하므로 이 답변의 첫 번째 스니펫에 붙여넣은 코드가 바로 그 코드입니다.
What I did:
byte[] result = ****encrypted data****;
String str = Base64.encodeBase64String(result);
return str;
byte[] bytes = Base64.decodeBase64(str);
사용자 데이터는 전출요 이 형식:
OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA==
Arrays.toString()`이 하는 일은 바이트 배열의 각 바이트에 대한 문자열 표현을 생성하는 것입니다.
API 설명서를 확인하세요. Arrays API
응답 문자열을 원래의 바이트 배열로 다시 변환하려면 split(",")
등을 사용하여 컬렉션으로 변환한 다음 컬렉션의 각 항목을 바이트 단위로 변환하여 바이트 배열을 다시 만들어야 합니다.
그 간단한 변환할지 바이트입니다 스토리지로는 문자열과 구체화하십시오 다시 바이트입니다 어레이입니다 jave. # 39, & # 39 new& 우리가 알아야 할 때 사용할 수 있습니다. 가장 효과적인 방식으로. 이 문제는 다음과 같이 해결할 수 있습니다.
바이트입니다 스토리지로는 문자열 변환:
byte[] bytes = initializeByteArray();
String str = new String(bytes);
문자열을 바이트입니다 어레이입니다 변환:
String str = "Hello"
byte[] bytes = str.getBytes();
자세한 내용은 여바바 http://support. http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
이 종류의 출력입니다 누리고 있습니다 너회의 바이트입니다 어레이입니다 (' [B@405217f8') 는 일찍이 출력입니다 kingdome. seattle. 제로 길이 바이트입니다 어레이입니다 (즉, 'new 바이트입니다 [0]'). 마치 이 구체화하십시오 참조입니다 스토리지와의 대한 설명을 아닌 일반 collection& 컨텐트에서 어레이입니다 기대할 수 있는 '처럼 우리 # 39 의 toString ()' 메서드입니다.
아니, 차라리 다른 점) 로 가장 많았고 'string' a '를 저장할 수 있는' 매개변수입니다 구성자를 너회들 chunghwa 문자열으로 바이트입니다 [] 의 내용을 바이트입니다 어레이입니다. # 39 에서 읽을 수 있어야 합니다 ',' s 기초형상 바이트입니다 socket& 린퍼타슬림 스케쳐내 바이트입니다 TCP 연결을 통해 얻을 수 있습니다.
이미 읽을 경우 해당 바이트입니다 비호환성의 'String' ('린퍼트슈타림레이더 사용하는'), 그리고 ' ()' 기능을 사용하여 제비츠 바이트입니다 구체화하십시오 변환할 수 있다. 반드시 통과될 수 있도록 ' ()' 기능을 모두 원하는 대로 글자셋 구체화하십시오 구성자를 제비츠 있는 경우에만 사용할 수 있으며, 이 데이터 바이트 문자를 '뒤에' 린퍼트슈타림레이더 변환할 수 있다.
정말 이 스트리밍합니다 판독기에서 스케쳐내 기초형상 바이트입니다 사용하지 않는 레이어에는 대처해야 합니다.
바이트를 그냥 바이트 단위로 보내거나 각 바이트를 문자로 변환하여 문자열로 보낼 수는 없나요? 지금처럼 보내면 보낼 바이트가 11바이트밖에 없는데 문자열에서 최소 85자를 차지하게 됩니다. 바이트의 문자열 표현을 만들 수 있는데, 예를 들어 "[B@405217f8"이면 Python에서 bytes
또는 bytearray
객체로 쉽게 변환할 수 있습니다. 그렇지 않은 경우, 22자를 차지하는 일련의 16진수(5b42403430353231376638)로 표현할 수 있으며, 이는 파이썬 측에서 binascii.unhexlify()
를 사용하여 쉽게 디코딩할 수 있습니다.
[JDK8]
import java.util.Base64;
문자열.
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
바이트 배열을 위한.
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
아래 코드를 바이트코드로 API 로 변환할 문자열을 바이트입니다 어레이입니다.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");