C/C++의 char와 .NET Framework의 byte

C와 C++에서 사용하는 버클리 소켓은 데이터를 주거나 받을 때 char 형식의 배열을 이용한다. .NET Framework에서도 char 형식과 가장 근접한 데이터 형식인 byte 형식의 배열을 이용한다. 하지만 약간의 호기심이 생겼다. 생각없이 사용하는 이들 소켓 API의 두 데이터 타입은 과연 숫자 범위까지 같은것일까?

C와 C++의 char 데이터 형식은 -128 ~ +127까지를 표현할 수 있다. 반면 .NET Framework의 byte는 0 ~ +255까지 표현이 가능하다. 정작 C와 C++과 호환성을 유지하기 위해서는 byte가 아닌 sbyte여야 했는데 왜 byte를 사용하게 된 것일까? sbyte는 char와 완전히 같은 데이터 범위를 보장함과 동시에 크기도 같다. 하지만 CLSCompliant(false) 플래그가 붙어있고 sbyte를 기반으로 구현된 소켓 API는 닷넷에 없다.

그래서 간단히 실험을 해보았다.

우선 .NET Framework의 소켓에서 BSD 소켓으로 데이터를 보내보았다. 물론 두 데이터 타입이 특별한 처리를 하지 않고도 표현할 수 있는 범위의 수인 0 ~ 127까지는 특이한 점이 없었다. 하지만 128 ~ 255의 값은 BSD 소켓에서 어떻게 받아들여질까? 대강 예상하고 있었고 실제로도 그렇게 되었는데, 음수로 뒤집어서 전달되었다. 순환 오버플로우와 유사하다는 생각이 들었다.

이번엔 반대로 BSD 소켓에서 .NET Framework의 소켓으로 데이터를 보내보았다. 위와 마찬가지로 0 ~ 127까지는 있는 그대로 전달되었다. 하지만 -128 ~ -1까지의 값은 음수로 전송되었지만 .NET Framework의 입장에서는 127 이후부터 255 사이의 양수값으로 바뀌어 들어갔다. 이 역시 순환 오버플로우와 유사한 동작이었다.

영양가 없는 실험이었지만 나름 궁금함은 풀어볼 수 있어서 좋았던것 같다. 그리고 결론을 하나 더 얻었는데, 실질적으로 우리가 네트워크를 통해서 전송하고자 하는 데이터의 범위는 0 ~ 127 안일 확률이 매우 높다. 2바이트 문자열과 유니코드 문자열도 결국은 이 범위 안에서 처리하도록 만들어지게 된다고 생각할 수 있겠다.

댓글 남기기