当前位置:  开发笔记 > 运维 > 正文

支持Linux用户空间中的字节排序

如何解决《支持Linux用户空间中的字节排序》经验,为你挑选了2个好方法。

我正在用C编写Linux程序来分析嵌入式系统生成的核心文件.核心文件可能是小端(ARM)或大端(MIPS),分析它们的程序可能在小端主机(x86)或大端(PowerPC)上运行.

通过查看标题,我知道核心是LE还是BE.我宁愿我的程序并不需要知道它运行在主机是否很少或大端,我想使用一个API来处理对我来说.如果没有更好的选择,我想我会开始依赖#ifdef __BIG_ENDIAN__.

在Linux内核中,我们有cpu_to_le32等从原生字节排序转换为小端等.在用户空间中有htonl等,它从原生端转换为大端,但是我找不到本机到小端的等价物.

任何人都可以为用户空间建议合适的API吗?

编辑:为了清楚,我正在寻找一个已经知道我的CPU是大端还是小端的API,并相应地交换.我不想为#ifdefs乱丢我的代码.我不只是在寻找代码片段来交换字节; 谢谢你们,但那不是重点.



1> ephemient..:

#include 很好,便携,但只保证{ntoh,hton}{s,l}.如果您需要大端(其中在64位的值转换,或端翻转ntohhton什么都不做),这是不够的.

在Linux(glibc)上,#include 提供以下内容,定义为适合当前计算机.

htobe16  be16toh    htole16  le16toh
htobe32  be32toh    htole32  le32toh
htobe64  be64toh    htole64  le64toh

在*BSD上,#include 提供这些相同的宏.



2> 小智..:

如果您可以访问霓虹灯协处理器并且内存是连续的(例如视频帧),您可以使用q寄存器(128字节)以这种方式在帧上执行swap16; 当然,你必须注意对齐问题

void swap16(void *__restrict src16)
{
    const void *start = src16;
    const void *end = src16 + FRAME_SIZE;
    asm volatile (
        "1: pld     [%0, #0x100]\n"
        "vld2.8         {q0,q1}, [%0]\n"
        "vmov           q2,q0\n"
        "vst2.8         {q1,q2}, [%0]!\n"
        "cmp            %1,%0\n"
        "bne            1b\n"
        : /* empty output operands */
        : "r" (start), "r" (end)
        : "cc", "memory"
        );
}

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有