Java 바이트 배열에서 문자열로 바이트 배열
바이트 대 문자열, 문자열의 문자열 표현, 바이트 대 바이트 변환...바이트[]를 전송할 문자열로 변환한 다음 웹 서비스(python으로 작성됨)가 데이터를 클라이언트로 바로 반향할 것으로 예상한다.
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]
python 쪽에서 python 서버는 호출자에게 문자열을 반환한다(내가 볼 수 있는 것은 내가 서버에 보낸 문자열과 동일함).
[-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
둘 다 내가 보낸 자료와 달라...나는 내가 정말 간단한 것을 놓치고 있다고 확신한다.
뭐 좀 도와줄까?!
반환된 문자열을 가져와서 문자열을 만들 수는 없어...a가 아니다.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
배열의 문자열 표현 유지 b1
, 한편s2
에 포함된 바이트의 문자열 표현 유지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);
콘솔에 "냉각 문자열"을 출력한다.
그건 정말 쉽다.
내가 한 짓은:
클라이언트로 돌아가기:
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()
does는 당신의 바이트 배열에서 각각의 개별 바이트의 문자열 표현을 만드는 것이다.
API 설명서 어레이 API를 확인하십시오.
응답 문자열을 원래 바이트 배열로 다시 변환하려면split(",")
또는 어떤 것을 가지고 그것을 모음으로 변환한 다음 그 안에 있는 각각의 개별 항목을 바이트로 변환하여 당신의 바이트 배열을 재생성한다.
바이트 배열을 문자열로 변환하고 문자열을 다시 자바의 바이트 배열로 변환하는 것은 간단하다. 우리는 'new'를 올바른 방법으로 사용해야 하는 시기를 알 필요가 있다.다음과 같이 할 수 있다.
문자열 변환에 대한 바이트 배열:
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
a를 수용하는 건설업자.byte[]
바이트 배열의 내용에서 문자열을 구성하기 위한 매개 변수.소켓에서 원시 바이트를 읽을 수 있어야 한다.InputStream
TCP 연결에서 바이트를 얻으려면
해당 바이트를 이미 다음과 같이 읽은 경우String
(an 사용)InputStreamReader
()를 사용하여 문자열을 바이트로 변환할 수 있음getBytes()
기능을 발휘하다원하는 문자 집합을 문자열 생성자와 문자열 생성자 모두에게 전달하십시오.getBytes()
함수, 그리고 이것은 바이트 데이터가 에 의해 문자로 변환될 수 있는 경우에만 작동된다.InputStreamReader
.
원시 바이트를 처리하려면 이 스트림 판독기 계층을 사용하지 마십시오.
바이트를 바이트로만 보내거나, 각 바이트를 문자로 변환하여 문자열로 보낼 수 없는가?너처럼 하면 11바이트만 보낼 수 있을 때 문자열에서 최소 85자 이상을 차지하게 된다.바이트의 문자열 표현을 만들 수 있으므로 "[B@405217f8"로 쉽게 변환할 수 있다.bytes
또는bytearray
Python으로 하다그렇지 않으면 22자를 차지하는 일련의 16진수 숫자(5b4240343035313736638")로 나타낼 수 있으며, 이 숫자는 를 사용하여 파이썬 측에서 쉽게 해독할 수 있다.
[JDK8]
import java.util.Base64;
받는 사람 문자열:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
바이트 배열 연결:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
하려면 문자열을 .String.getBytes()
(또는 동등한 Python 함수) 그러면 원본 바이트 배열을 인쇄할 수 있다.
아래 코드 API를 사용하여 바이트 코드를 문자열로 변환하십시오.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
[JAVA 8]
import java.util.Base64;
String dummy= "dummy string";
byte[] byteArray = dummy.getBytes();
byte[] salt = new byte[]{ -47, 1, 16, ... }
String encoded = Base64.getEncoder().encodeToString(salt);
바이트 배열을 문자열로 변환한 다음 해당 문자열을 바이트 배열로 변환하려면 다음을 수행하십시오.
// 1. convert byte array to string and then string to byte array
// convert byte array to string
byte[] by_original = {0, 1, -2, 3, -4, -5, 6};
String str1 = Arrays.toString(by_original);
System.out.println(str1); // output: [0, 1, -2, 3, -4, -5, 6]
// convert string to byte array
String newString = str1.substring(1, str1.length()-1);
String[] stringArray = newString.split(", ");
byte[] by_new = new byte[stringArray.length];
for(int i=0; i<stringArray.length; i++) {
by_new[i] = (byte) Integer.parseInt(stringArray[i]);
}
System.out.println(Arrays.toString(by_new)); // output: [0, 1, -2, 3, -4, -5, 6]
그러나 문자열을 바이트 배열로 변환한 다음 해당 바이트 배열을 문자열로 변환하려면 아래 접근 방식을 사용할 수 있다.
// 2. convert string to byte array and then byte array to string
// convert string to byte array
String str2 = "[0, 1, -2, 3, -4, -5, 6]";
byte[] byteStr2 = str2.getBytes(StandardCharsets.UTF_8);
// Now byteStr2 is [91, 48, 44, 32, 49, 44, 32, 45, 50, 44, 32, 51, 44, 32, 45, 52, 44, 32, 45, 53, 44, 32, 54, 93]
// convert byte array to string
System.out.println(new String(byteStr2, StandardCharsets.UTF_8)); // output: [0, 1, -2, 3, -4, -5, 6]
나 또한 다음 질문에서도 같은 대답을 했다: https://stackoverflow.com/a/70486387/17364272
참조URL: https://stackoverflow.com/questions/6684665/java-byte-array-to-string-to-byte-array
'IT이야기' 카테고리의 다른 글
Vuex 상태에서 v-if를 사용하는 Vue3 구성 요소 (0) | 2022.05.16 |
---|---|
새 Vue 앱 버전을 릴리스할 때 크롬에서 캐시를 강제로 지우는 방법 (0) | 2022.05.15 |
@Before, @BeforeClass, @BeforeAll과 @BeforeAll 사이의 차이 (0) | 2022.05.15 |
Vue.js - v-model에서 매개 변수를 전달하여 중첩된 속성 변경 (0) | 2022.05.15 |
Vue Watch가 트리거하지 않음 (0) | 2022.05.15 |