2014-05-15 36 views
0

我正在從DNS服務器獲取一些數據,並試圖將某個部分轉換爲無符號整數(表示刷新間隔,到期等)。通過轉換,我的意思是從大端到小端。問題是,還有ntohs地方只有2個字節的數據,而不是4使用ntohs的無符號整數

memcpy(&number, data, 4); 
printf("%x ",number); 
number = ntohs(number); 
printf("%x ",number); 

Output: 
b6fc0b78 780b 

關於類型:

:t data 
char* 
:t number 
unsigned int 

奇怪的是,即使通過嘗試使用位轉移到重建的數量,值是非常不同的:例如0。

如何從b6fc0b78中將780bfcb6轉換爲unsigned int?

+0

Readig文檔可能會導致啓示。 – alk

+0

我做到了。但是在我給出的文檔中,關於ntohs的唯一說法是它用於從網絡順序轉換爲主機順序。 –

+0

如果在類似UNIX的系統上,類似終端窗口中輸入的'man ntohs'大多是一個很好的參考。 – alk

回答

3

注意780b0b78字節交換,這是你在傳遞數的低16位。

ntohssshort。它的數量爲uint16_tntohs的參數和返回類型僅爲unsigned int,因爲它早於C89原型;在K & R C中,不可能表示函數的參數短於int。 (最新的POSIX規範seems to have decided that this historical wart is no longer necessary可以說服GCC和鐺警告有關這個錯誤,但只有使用-Wconversion,這不是由-Wall開啓,-Wextra,也不-pedantic。)

功能你正在尋找因爲是ntohl。它運行在uint32_t數量,這是你想要的。 (l用於long,但它可以追溯到64位long聞所未聞的時間。)