【问题标题】:Byte order functions on stm32 microcontrollerstm32微控制器上的字节顺序功能
【发布时间】:2019-12-10 21:06:31
【问题描述】:

有没有像我在论坛上找到的这样的 htonll,ntohll,ntohl,htonl 的书面函数:

uint32_t ntohl(uint32_t const net) {
    uint8_t data[4] = {};
    memcpy(&data, &net, sizeof(data));

    return ((uint32_t) data[3] << 0)
         | ((uint32_t) data[2] << 8)
         | ((uint32_t) data[1] << 16)
         | ((uint32_t) data[0] << 24);
}

或者你能告诉我每一个的数据转移方案,然后像上面这个一样写吗?

编辑:

这些正确吗:

uint32_t htonl(uint32_t const net) {
    uint8_t data[4] = {};
    memcpy(&data, &net, sizeof(data));

    return ((uint32_t) data[0] << 0)
         | ((uint32_t) data[1] << 8)
         | ((uint32_t) data[2] << 16)
         | ((uint32_t) data[3] << 24);
}

uint64_t htonll(uint64_t const net) {
    uint8_t data[4] = {};
    memcpy(&data, &net, sizeof(data));

    return ((uint64_t) data[0] << 0)
         | ((uint64_t) data[1] << 8)
         | ((uint64_t) data[2] << 16)
         | ((uint64_t) data[3] << 24);
}

uint64_t ntohll(uint64_t const net) {
    uint8_t data[4] = {};
    memcpy(&data, &net, sizeof(data));

    return ((uint64_t) data[3] << 0)
         | ((uint64_t) data[2] << 8)
         | ((uint64_t) data[1] << 16)
         | ((uint64_t) data[0] << 24);
}

【问题讨论】:

    标签: endianness byte-shifting


    【解决方案1】:

    这不是 STM32 特定的,但可以为所有 ARM MCU 一般回答。假设您使用的是 gcc,则有像 __builtin_bswap32 这样的内置函数。

    所以你可以将它实现为:

    uint32_t htonl(uint32_t net)
    {
        return __builtin_bswap32(net);
    }
    
    uint16_t htons(uint16_t net)
    {
        return __builtin_bswap16(net);
    }
    
    uint64_t htonll(uint64_t net)
    {
        return __builtin_bswap64(net);
    }
    

    生成的汇编代码非常高效:

    htonl:
            rev     r0, r0
            bx      lr
    htons:
            rev16   r0, r0
            uxth    r0, r0
            bx      lr
    htonll:
            rev     r3, r0
            rev     r0, r1
            mov     r1, r3
            bx      lr
    

    如果你将函数声明为inline,你甚至可以保存函数调用。

    顺便说一句:在您的代码中,64 位版本可能不正确,因为它们只返回 32 位数量。

    【讨论】:

    • 谢谢.. 我需要更改您的代码以获得 ntohl 和 ntohll
    • ntohlhtonl 完全相同,即以相反的顺序重新排列字节。所以代码是一样的。这同样适用于其他对。
    猜你喜欢
    • 2020-12-22
    • 2015-08-16
    • 2021-08-11
    • 2022-09-26
    • 2020-07-20
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多