자바 byte [] 스 트 링 다시 byte [] 불일치 문제

7319 단어 자바
최근 프로젝트 를 할 때 byte [] 를 map 의 value 에 저장 하기 위해 String 으로 저장 하고 필요 할 때 꺼 내 byte [] 로 되 돌 렸 으 나 실현 과정 에서 문제 가 발견 되 었 습 니 다. 되 돌 리 는 byte [] 는 원래 와 일치 하지 않 습 니 다.
byte[] bytes = Hex.decode("1a91031001");
String str = new String(bytes);
byte[] after = str.getBytes();
System.out.println("before: " + Hex.encode(bytes) + "--" + Arrays.toString(bytes));
System.out.println("after : " + Hex.encode(after) + "--" + Arrays.toString(after));

출력:
before: 1a91031001--[26, -111, 3, 16, 1]
after : 1a3f031001--[26, 63, 3, 16, 1]

자 료 를 찾 아 보 니 인 코딩 의 문제 입 니 다. 제 시스템 에서 자바 의 기본 인 코딩 은 GBK 입 니 다.
System.out.println(Charset.defaultCharset().name()); // 输出:GBK

이것 은 다 중 바이트 인 코딩 입 니 다. 즉, 여러 바이트 로 한 문 자 를 표시 해 야 하기 때문에 바이트 배열 이 문자열 로 인 코딩 된 후에 다시 돌아 오 면 원래 와 일치 하지 않 는 문제 가 발생 할 수 있 습 니 다. 해결 방법:
"ISO - 8859 - 1"과 같은 단일 바이트 인 코딩 형식 을 지정 합 니 다.
byte[] bytes = Hex.decode("1a91031001");
String str = new String(bytes, Charset.forName("ISO-8859-1"));
byte[] after = str.getBytes(Charset.forName("ISO-8859-1"));
System.out.println("before: " + Hex.encode(bytes) + "--" + Arrays.toString(bytes));
System.out.println("after : " + Hex.encode(after) + "--" + Arrays.toString(after));

출력:
before: 1a91031001--[26, -111, 3, 16, 1]
after : 1a91031001--[26, -111, 3, 16, 1]

참고 글:https://www.cnblogs.com/Hays4Blog/p/6755550.html https://blog.csdn.net/wusj3/article/details/80606728

좋은 웹페이지 즐겨찾기