网络字节序和主机字节序互转

这篇博客介绍了如何在不同字节序环境下进行网络字节序到主机字节序的转换,以及如何利用补码实现负数的表示。通过实用的函数代码展示了跨平台的数值处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.网络字节序转为主机字节序

//网络字节序转为主机字节序
uint64_t utils::Ntohll(uint64_t val)
{
    if (__BYTE_ORDER == __LITTLE_ENDIAN) {
        return (((uint64_t)ntohl((int32_t)((val << 32) >> 32))) << 32)
               | (uint32_t)ntohl((int32_t)(val >> 32));
    } else if (__BYTE_ORDER == __BIG_ENDIAN) {
        return val;
    }
}

2.主机字节序转为网络字节序

//主机字节序转为网络字节序
uint64_t utils::Htonll(uint64_t val)
{
    if (__BYTE_ORDER == __LITTLE_ENDIAN) {
        return (((uint64_t)htonl((int32_t)((val << 32) >> 32))) << 32)
               | (uint32_t)htonl((int32_t)(val >> 32));
    } else if (__BYTE_ORDER == __BIG_ENDIAN) {
        return val;
    }
}

3.另外加一个函数:根据补码转为负数:

//根据补码转为负数
int64_t utils::ComplementToForm(int64_t value, uint32_t bit_num)
{
    uint32_t count = 0;
    int64_t ret = 0;

    if (bit_num == 0) {
        return value;
    }

    if (((value >> (bit_num - 1)) & 1) == 1) {
        while (count <= (bit_num - 1)) {
            ret |= (((value >> count) & 1) ^ 1) << count;
            count++;
        }

        ret += 1;
        return -ret;

    } else {
        TRACE_WITH_DETAIL("this is a positive number\n ");
    }

    return value;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值