【问题标题】:How to convert __u32 to __be32 in Linux Kernel如何在 Linux 内核中将 __u32 转换为 __be32
【发布时间】:2014-02-21 11:11:17
【问题描述】:

我有一个变量

__be32 x;

我有一个函数

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

我需要将 foo 的返回值存储在变量 x 中。

x=htonl(foo());

正确吗? 我很困惑ntohl()htonl() 的返回类型是什么。他们是对立的吗?

要检查输出,我需要重新编译内核,我不想让我的系统出现任何错误。所以我在这里问。

【问题讨论】:

    标签: c linux-kernel htonl


    【解决方案1】:

    您可以使用 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);
    

    【讨论】:

    • ...这里实际使用的宏是x = cpu_to_be32(foo());
    • @unwind 谢谢。但是别名很容易使用。
    • @Nick 为什么这么固执的人。你为什么要放弃我的编辑。我在问ntohl()htonl()。您提供的链接提到了它们。我得到了答案,别名比实际的宏更好。所以我正在编辑以包含别名。
    • 那是什么?我离开了……没有丢弃任何东西。把它们放回去,我会批准......或者他们作为不同的答案。
    • @Nick 不知道。此刻,我可以通过“等待同行评审”看到我的编辑。下一刻,它就消失了。
    猜你喜欢
    • 2023-03-31
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多