2014-02-21 209 views
3

到__be32我有一個變量如何轉換__u32在Linux內核

__be32 x; 

我有一個功能

__u32 foo(void){ 
     __u32 a; 
     return a; 
} 

我需要存儲的foo變量x回報。

x=htonl(foo()); 

它正確嗎? 我有一個混淆,什麼是ntohl()htonl()返回類型。它們是否彼此相反?

爲了檢查輸出,我需要重新編譯內核,我不想讓系統出現任何錯誤。所以我在這裏問。

回答

6

您可以使用kernel.h當定義的宏:

http://www.bruceblinn.com/linuxinfo/ByteOrder.html

下面的宏返回值已轉換後。 注意:linux/kernel.h頭文件是包含在使用這些宏的源文件中的 的頭文件,但它不是實際定義宏的頭文件,而是 。

#include <linux/kernel.h> 
__u16 le16_to_cpu(const __le16); 
__u32 le32_to_cpu(const __le32); 
__u64 le64_to_cpu(const __le64); 

__le16 cpu_to_le16(const __u16); 
__le32 cpu_to_le32(const __u32); 
__le64 cpu_to_le64(const __u64); 

__u16 be16_to_cpu(const __be16); 
__u32 be32_to_cpu(const __be32); 
__u64 be64_to_cpu(const __be64); 

__be16 cpu_to_be16(const __u16); 
__be32 cpu_to_be32(const __u32); 
__be64 cpu_to_be64(const __u64); 
+3

......和宏實際使用這裏將是'X = cpu_to_be32(FOO());'。 – unwind

+0

@unwind謝謝。但別名很容易使用。 – RatDon

+0

@尼克爲什麼這麼固執的人。你爲什麼要放棄我的編輯。我問'ntohl()'和'htonl()'。你提供的鏈接提到了它們。我有我的答案,別名比實際的宏更好。所以我正在編輯以包含別名。 – RatDon