자바의 Primitive Data Type 들 중에는 unsigned 데이터 타입이 존재하지 않습니다.
unsigned를 특별히 사용할 일이 없을때는 의식하지 못하고 있었는데, 자바에서(정확히는 안드로이드에서 사용할 목적으로) 음성을 G.711 인코딩/디코딩 하기 위한 코덱을 구현 하던 중 깨닫게 되었습니다.
byte 타입을 unsigned 로 0~255 을 사용하고 싶었지만, 자바에서는 unsigned 키워드 자체가 존재하지 않아 byte 타입은 -128~127 의 값을 갖게 되어 있더군요. 즉 2's complement 의 값입니다.
하지만 제가 필요한 것은 0~255 의 범위값이었습니다.
정확히는, C#에서 byte 타입으로 보낸 0~255의 값 (이진 값으로는 0000 0000 ~ 1111 1111 이 되겠죠) 을 자바에서도 0~255로 해석하도록 해야 했습니다.
그래서 이를 해결하기 위해 꼼수를 생각해 본 결과..
다음과 같이 하여 해결 할 수 있었습니다.
byte value = xxx;
int nValue = 0;
if (value < 0)
nValue = (int)value + 256;
else
nValue = (int)value;
결과적으로 nValue에는 byte 값을 unsigned 로 변환한 값이 들어가게 됩니다.
원리는 간단하죠.
0~127 값은 그대로 사용하면 됩니다. 2진수로 표현할 경우 0XXX XXXX 가 되기 때문이죠.
문제가 되는 -128~-1 은 2진수로 표현할 경우 1XXX XXXX 가 되며, MSB(most significant bit) 가 1이어서 어떻게 해석하느냐에 따라 표현되는 값이 달라지게 됩니다. 즉 unsigned 면 이를 128~255 로 표현 하겠죠. signed 면 2's complement 부호비트로 해석하여 -128 ~ -1 로 해석하는 것이죠.
결론은 -128 ~ -1 에 256을 더해주면, 됩니다.
unsigned를 특별히 사용할 일이 없을때는 의식하지 못하고 있었는데, 자바에서(정확히는 안드로이드에서 사용할 목적으로) 음성을 G.711 인코딩/디코딩 하기 위한 코덱을 구현 하던 중 깨닫게 되었습니다.
byte 타입을 unsigned 로 0~255 을 사용하고 싶었지만, 자바에서는 unsigned 키워드 자체가 존재하지 않아 byte 타입은 -128~127 의 값을 갖게 되어 있더군요. 즉 2's complement 의 값입니다.
하지만 제가 필요한 것은 0~255 의 범위값이었습니다.
정확히는, C#에서 byte 타입으로 보낸 0~255의 값 (이진 값으로는 0000 0000 ~ 1111 1111 이 되겠죠) 을 자바에서도 0~255로 해석하도록 해야 했습니다.
그래서 이를 해결하기 위해 꼼수를 생각해 본 결과..
다음과 같이 하여 해결 할 수 있었습니다.
byte value = xxx;
int nValue = 0;
if (value < 0)
nValue = (int)value + 256;
else
nValue = (int)value;
결과적으로 nValue에는 byte 값을 unsigned 로 변환한 값이 들어가게 됩니다.
원리는 간단하죠.
0~127 값은 그대로 사용하면 됩니다. 2진수로 표현할 경우 0XXX XXXX 가 되기 때문이죠.
문제가 되는 -128~-1 은 2진수로 표현할 경우 1XXX XXXX 가 되며, MSB(most significant bit) 가 1이어서 어떻게 해석하느냐에 따라 표현되는 값이 달라지게 됩니다. 즉 unsigned 면 이를 128~255 로 표현 하겠죠. signed 면 2's complement 부호비트로 해석하여 -128 ~ -1 로 해석하는 것이죠.
결론은 -128 ~ -1 에 256을 더해주면, 됩니다.
'개발자의 기록 노트 > Java' 카테고리의 다른 글
[SWT] 이벤트 (0) | 2012.12.07 |
---|---|
Java에서 AES 128 암호화/복호화 구현 (0) | 2012.11.16 |
[Java] 비트 연산자 / 시프트 연산자 (2) | 2012.02.02 |
[Java] 정규표현식 표현 방법 (0) | 2011.12.19 |
Java Decomplier JAD 와 JadClipse 설치 및 활용 (0) | 2011.11.06 |
부분문자열을 얻는 방법 - Java와 SQL (0) | 2010.11.06 |