2014-06-07 4 views
3

나는 이상한 것을 알아 차렸을 때 IP 패킷 '파서'를 조작하고 있었다. ReadInt32 대 ReadUInt32

그것은

private uint srcAddress; 
// stuff 
srcAddress = (uint)(binaryReader.ReadInt32()); 

트릭을 수행 C#으로, IP 주소를 구문 분석에 왔을 때, 그래서 당신이 VB.Net 너무 트릭을 할 것

Private srcAddress As UInteger 
'' stuff 
srcAddress = CUInt(binaryReader.ReadInt32()) 

을 equivallent 생각할 것입니다. 그렇지 않습니다. 그러나 :

srcAddress = reader.ReadUInt32() 

그러나.

발견에 약간의 시간이 걸렸지 만, 내가 뭘 어루 만졌다해도? 왜 이런거야 ?

+3

'uint '가 필요할 때 왜 처음에'ReadInt32()'를 사용하고 있습니까? – Stijn

+0

VB 코드와 동일한 입력을 C# 코드에 제공합니까? C# 값으로 MSB를 0으로 설정하면 운이 좋을 수도 있으므로 서명 된 int와 서명되지 않은 int 사이에는 아무런 차이가 없습니다. VB에서 두 개의 출력을 올리고 올 수 있습니까? 가능한 경우 16 진수. – bytefire

+0

VB에서는 산술 오버플로 또는 IP 주소가 잘못되었습니다. As, 이유 : 내가 찾은 대부분의 C# 예제는 그런 식으로하고 1st에서는 '맹목적으로'번역했습니다. 당신이 옳았습니다.하지만 저는 그것을 변경했지만 여전히 차이점은 무엇입니까? – esjr

답변

5

VB.NET은 기본적으로 C#이 기본적으로 수행하지 않는 작업을 수행합니다. 항상 숫자 오버플로를 확인합니다. 그리고 은 코드에서 트리거가됩니다. 마지막 비트가 0이 아닌 IP 주소는 음수를 생성하고 UInteger로 변환 할 수 없습니다. 양수 32 비트 숫자 만 저장할 수있는 데이터 유형입니다.

C#에도이 옵션이 있으므로 코드에 키워드를 명시 적으로 사용해야합니다. 또는 VB.NET 프로젝트가 기본적으로 켜져있는 옵션과 동일한 옵션을 사용하십시오. Project + Properties, Build 탭, Advanced에서 "산술 오버플로/언더 플로우 검사"체크 박스를 선택하십시오. VB.NET 프로젝트의 동일한 옵션은 기본적으로 "정수 오버플로 검사 제거"라는 이름을 갖습니다.

이 기본값이 언어 구문에도 어떻게 영향을 미치는지 유의하십시오. C#에서는 이있어 값을 호환되지 않는 값 유형으로 변환하는 캐스트를 작성합니다. VB.NET에서는 필요하지 않지만 런타임 검사는 문제가 발생하지 않도록합니다. 그것은 매우 나쁜 종류의 문제입니다. 오버플로가 크게 나쁜 결과를 가져올 수 있습니다. 사실, IP 주소는 실제로 서명되지 않은 번호입니다.

IP 주소에 대한 다른 단점을 염두에두고 소켓은 LSD 및 빅 엔디안 프로세서로 구동되는 Unix 시스템에서 처음으로 개발되었습니다. IPAddress.NetworkToHostOrder()를 사용하여 올바른 순서로 주소를 가져와야합니다. 인수로 부호있는 정수 유형을 사용하는 오버로드 만 있습니다. 따라서 ReadInt32()를 사용하는 것은 실제로 정확합니다. IPv4 주소라고 가정하면 NetworkToHostOrder()에 직접 전달합니다. 오버플로가 발생할 염려가 없습니다.

+0

정확히 내가보고있는 것! 그리고 지금 나는 이유를 안다. 감사 ! – esjr