int a = htonl(int b) 이러는데 자꾸 버그먹어서 개 헤맸는데
저거 그냥 short a = htons(int b) 하니까 바로 되네..
뭐지... 이거 될텐데 그냥;;
내가 하도 정신이 없어서 변수 선언해놓은곳에 타입을 제대로 안봤나..
int a = htonl(int b) 이러는데 자꾸 버그먹어서 개 헤맸는데
저거 그냥 short a = htons(int b) 하니까 바로 되네..
뭐지... 이거 될텐데 그냥;;
내가 하도 정신이 없어서 변수 선언해놓은곳에 타입을 제대로 안봤나..
응 안돼. C/C++ 표준 상 int 형과 long 형의 크기는 다를 수 있다고 명시되어 있어. 2 ≤ sizeof(int) ≤ sizeof(long), 4 ≤ sizeof(long)라고 정의되어 있지. 실제 과거 16비트 시절엔 int는 2바이트(16비트)였고 long은 4바이트(32비트)였었고, 지금 64비트 OS 중에 int는 4바이트(32비트), long은 8바이트(64비트)인 환경도 존재함.
부와아아아앜
내 잃어버린 6시간읗 데니스리치에게 청구하러 가겠습이다
뭐 대입했다고 해서 컴파일이 안되진 않고(컴파일러는 대입할 공간의 타입 크기가 작다는 경고만 띄워줄 뿐) 또 너가 글 본문에서 '버그'가 생겼다는 표현을 쓴 걸 볼 때 int 형은 4바이트이고 long 형은 8바이트인 64비트 리눅스 환경에서 프로그램을 짜다가 버그가 걸린 거 같다.
윈도우에서는 64비트 환경에서도 하위 호환성 때문에 int 형과 long 형은 모두 4바이트 거든. 대신 윈도우에서는 8바이트 정수를 쓰고 싶으면 long long (int)를 쓰고.
엥? 난 윈도에서 작업했는데.... 그럼 뭔가 다른걸 실수했나보다...
윈도우에서의 표준은 int = long = 4바이트지만(윈도우 API가 그런 타입으로 설계되어 있으니), 이건 MS 사의 Visual C++에만 적용되는 표준일 뿐. 다른 컴파일러는 윈도우에서 돌아가더라도 타입 크기를 다르게 쓸 수는 있어.
가령 gcc 같은 건 다를 수 있다는 말이야. 그리고 타 플랫폼을 위한 크로스 컴파일 시에는 윈도우에서 작업하는 게 중요한 게 아니라 대상 플랫폼이 뭐냐가 더 중요한 거 알지? 윈도우에서 64비트 리눅스용 프로그램을 컴파일한다고 해서 윈도우의 기준으로 맞춰지는 게 아니라는 말임. 64비트 리눅스의 기준으로 맞춰질 뿐.
그리고 내가 볼 때도 비트 문제가 아니라 너가 다른 로직에서 실수한 게 분명하다. short 형으로 해야 되는 문제인데 int 형으로 해서 처리해서 문제가 생긴 건 아니고? 리틀 엔디안(host)에서 빅 엔디안(network)으로 long 값을 고칠 때랑(long) short 값을 고칠 때(short)는 같은 값을 변환해도 결과 값이 너무 다름. 0x12 인게 0x12000000으로 되냐와 0x1200으로 되냐의 차이니깐.
윈도에서 윈속 사용하는 중이라 리눅스랑은 관계없을듯ㅋㅋㅋㅋ 하여간 오늘도ㅠ개뻘짓으로 몇시간 날리노.....
두번째처럼 했더니 잘 되는 거라면 a도 b도 타입은 short가 맞을 게 틀림 없음. 결국 a 값을 사용하는 문맥에서 쓰는 함수의 매뉴얼이라던지 프로토콜 헤더 채우는 거면 프로토콜 헤더 스펙을 다시 한 번 살펴 봐라.
ㅇㅇ 내생각해도 쇼트랑 인트를 제대로 안본거같음. 대용량 파일 제어도 해야해서 65000이 최대값인 언사인드 쇼트론 파일 길이를 다 표현 못하잔아
혹 가능하면 앞뒤로 a와 b에 관련된 문장들을 좀 더 글에 추가해 주면 내가 확인은 해 볼 게. :p
원래는 메시지만 주고받는 용도여서 쇼트를 썻는데
ㅋㅋㅋㅋ오늘은 걍 잘랍니다 더 붙들고 있다간 당장 뛰어내릴듯
언제나 좋은정보 ㅅㅅㅅ
http://autogram.tk/이
중고차 어플리케이션 어떤가요?