2013-07-24 2 views
4

아무도 나에게 무슨 일이 일어나고 있는지 말해 줄래?변환 바이트 배열 -> 문자열 -> 바이트 배열 데이터를 손상

 byte[] stamp = new byte[]{0,0,0,0,0,1,177,115}; 
     string serialize = System.Text.Encoding.UTF8.GetString(stamp); 
     byte[] deserialize = System.Text.Encoding.UTF8.GetBytes(serialize); 

     //deserialize == byte[]{0,0,0,0,0,1,239,191,189,115} 

이유는 무엇입니까! = deserialize ??

+1

당신은 여전히 ​​** 같은 문자열 **이 아니겠습니까? 원시 바이트를 보존하기 위해 인코딩이 필요하지 않습니다 ... –

+0

그들은 동일한 문자열 일 수 있지만 SQL 타임 스탬프로 작업하므로 문자열이 아니라 바이트를 고려합니다. –

답변

5

원래 바이트 배열에는 177 문자가 있으며 더하기 기호입니다. 그러나 직렬화 중에는 해당 코드가 인식되지 않습니다. 교체 용 문자 인 239 191 189으로 바뀝니다.

다음은 참조 용 차트입니다. http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec

필자는 잘 모르겠다. plusminus 기호가 인식되지 않는 이유는 무엇입니까?하지만 이것이 바이트 배열이 동일하지 않은 이유입니다. 그 스왑 이외에, 그들은 평등하고 데이터가 어떤 식 으로든 손상되지 않습니다.

+0

아 ... 말이 되네요 ... 고마워요! –

+1

좋은 질문입니다. 생각 나게하고 그것에 대해 읽었습니다. 흥미로운 문제입니다! –

4

바이트 배열은 UTF-8로 유효한 텍스트 문자열을 인코딩하지 않으므로 "직렬화"할 때 인식 할 수없는 부분은 "대체 문자"로 바뀝니다. 바이트 배열을 문자열로 변환해야하는 경우 ISO-8859-1과 같이이 같은 제한이없는 인코딩을 찾아야합니다.

특히, 유효한 UTF-8에서는 바이트 177이 자체적으로 나타날 수 없습니다. 128-191 범위의 바이트는 194-244 범위의 바이트가 표시된 후에 만 ​​나타날 수있는 "연속 바이트"입니다. UTF-8에 대한 자세한 내용은 여기를 참조하십시오. https://en.wikipedia.org/wiki/UTF-8

+0

이 테이블의 의미는 무엇입니까? http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&utf8=dec? –

+1

U + 0080에서 U + 017F까지 UTF-8로 인코딩 된 유니 코드 문자의 표와 의미를 알 수 있습니다. 예를 들어, U + 00F8은 LATIN SMALL LETTER O라고 불리우며, UTF-8로 (195, 184)로 인코딩되어 있습니다.이 모양은 다음과 같습니다. ø – Joni

+0

완벽한, 감사합니다! –