[java] Java 바이트 배열에서 문자열로 바이트 배열로

byte []에서 문자열로, byte []에서 byte [] 로의 문자열 표현을 이해하려고 노력하고 있습니다 … 나는 byte []를 보낼 문자열로 변환 한 다음 웹 서비스 (파이썬으로 작성)를 기대합니다 클라이언트로 데이터를 바로 에코합니다.

Java 애플리케이션에서 데이터를 보낼 때 …

Arrays.toString(data.toByteArray())

보낼 바이트 ..

[B@405217f8

Send (이것은 내 바이트 데이터의 문자열 표현이어야하는 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);

** 편집 **

당신은 당신이 “라고 질문에서 문제의 힌트를 얻을 Whatever I seem to try I end up getting a byte array which looks as follows... [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, 배열 의 문자열 표현 b1s2유지하고에 포함 된 바이트 의 문자열 표현 을 유지합니다 b1.

이제 문제에서 서버는와 비슷한 문자열을 반환 s1하므로 배열 표현을 다시 얻으려면 반대 생성자 메서드가 필요합니다. s2.getBytes()의 반대 인 경우 의 반대 new String(b1)를 찾아야 Arrays.toString(b1)하므로이 답변의 첫 번째 조각에 붙여 넣은 코드입니다.


답변

String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

콘솔에 “cool string”을 출력합니다.

꽤 쉽습니다.


답변

제가 한:

고객에게 반환 :

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()일은 당신이 ByteArray 각 바이트의 문자열 표현을 만드는 것입니다.

API 문서 배열 API를 확인하십시오

응답 문자열을 원래 바이트 배열로 다시 변환하려면 split(",")또는 무언가 를 사용 하여 컬렉션으로 변환 한 다음 거기에있는 각 개별 항목을 바이트로 변환하여 바이트 배열을 다시 만들어야합니다.


답변

바이트 배열을 문자열로 변환하고 문자열을 Java에서 바이트 배열로 다시 변환하는 것은 간단합니다. 올바른 방법으로 ‘신규’를 사용해야하는시기를 알아야합니다. 다음과 같이 수행 할 수 있습니다.

바이트 배열을 문자열로 변환 :

byte[] bytes = initializeByteArray();
String str = new String(bytes);

문자열을 바이트 배열로 변환 :

String str = "Hello"
byte[] bytes = str.getBytes();

자세한 내용은 다음을 참조하십시오.
http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html


답변

바이트 배열 ( [B@405217f8) 에서보고있는 출력의 종류는 길이가 0 인 바이트 배열 (예 :)의 출력이기도합니다 new byte[0]. 이 문자열은 일반 컬렉션의 toString()메소드 에서 예상 할 수있는 것처럼 배열의 내용에 대한 설명이 아니라 배열에 대한 참조 인 것 같습니다 .

다른 응답자와 마찬가지로 바이트 배열의 내용에서 문자열을 구성하는 매개 변수를 String허용하는 생성자를 알려 byte[]줍니다. InputStreamTCP 연결에서 바이트를 얻으려면 소켓에서 원시 바이트를 읽을 수 있어야 합니다.

해당 바이트를 이미 String(를 사용하여 InputStreamReader) 읽은 경우 getBytes()함수를 사용하여 문자열을 바이트로 변환 할 수 있습니다 . 원하는 문자 세트를 String 생성자와 getBytes()함수 모두에 전달해야 합니다. 이는 바이트 데이터를로 문자로 변환 할 수있는 경우에만 작동합니다 InputStreamReader.

원시 바이트를 처리하려면이 스트림 리더 계층을 사용하지 않아야합니다.


답변

바이트를 바이트로 보내거나 각 바이트를 문자로 변환하고 문자열로 보낼 수 있습니까? 11 바이트 만 보내면 문자열을 그대로 사용하면 문자열에 최소 85자를 사용할 수 있습니다. 바이트의 문자열 표현을 만들 수 있으므로 “[B @ 405217f8″이 되어 파이썬에서 bytes또는 bytearray객체 로 쉽게 변환 할 수 있습니다 . 실패하면 22자를 사용하는 일련의 16 진 숫자 ( “5b42403430353231376638”)로 표시 할 수 있으며,이를 사용하여 Python 측에서 쉽게 해독 할 수 있습니다 binascii.unhexlify().