首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++后端和后端

C++后端和后端
EN

Stack Overflow用户
提问于 2013-05-04 22:26:05
回答 5查看 11.2K关注 0票数 3

我发现以下代码能够将int64_t转换为网络字节顺序。现在,我需要相反的代码,以便将网络字节顺序转换回我的小endian机器。代码是这样的。

代码语言:javascript
复制
int64_t decode(void* value){
    int64_t vv = *((int64_t*) value);
    int num = 42;
    if(*(char *)&num == 42) //test big/little endian
        return (((uint64)htonl(vv)) << 32) + htonl(vv >> 32);
    else 
        return vv;
}

非常感谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-04 22:38:04

您的htonll的代码

代码语言:javascript
复制
#define htonll(x) ((((uint64_t)htonl(x)) << 32) + htonl((x) >> 32))

将字节首尾相接地翻转。如果应用两次,它会将值恢复到其原始状态。因此,同样的函数也可以用于ntohll

票数 5
EN

Stack Overflow用户

发布于 2017-11-20 02:07:43

htonl可以通过以下步骤完成

如果它的高字节顺序系统直接返回值,则返回

  • 。不需要做任何转换。如果它的小端系统,需要做下面的conversion.
  • Take LSB 32位,并应用'htonl‘和移位32次。
  • 采用MSB 32位(通过将uint64_t值右移32次),并应用‘htonl’
  • 现在对第二步和第三步中接收到的值应用逐位OR。

对于ntohll也是如此

代码语言:javascript
复制
#define HTONLL(x) ((1==htonl(1)) ? (x) : (((uint64_t)htonl((x) & 0xFFFFFFFFUL)) << 32) | htonl((uint32_t)((x) >> 32)))
#define NTOHLL(x) ((1==ntohl(1)) ? (x) : (((uint64_t)ntohl((x) & 0xFFFFFFFFUL)) << 32) | ntohl((uint32_t)((x) >> 32)))
票数 1
EN

Stack Overflow用户

发布于 2013-05-04 22:46:56

下面是我如何使用一个联合来做这件事。位移位的方法也会工作得很好,但我想要做得更好一点。

代码语言:javascript
复制
#include<stdlib.h>
#include<stdio.h>

union MyUnion {
   int64_t i64;
   int32_t i32[2];
};

int64_t htonll(int64_t hostFormatInt64)
{
   MyUnion u;
   u.i64 = hostFormatInt64;
   int32_t temp = u.i32[0];
   u.i32[0] = htonl(u.i32[1]);
   u.i32[1] = htonl(temp);
   return u.i64;
}

int64_t ntohll(int64_t networkFormatInt64)
{
   MyUnion u;
   u.i64 = networkFormatInt64;
   int32_t temp = u.i32[0];
   u.i32[0] = ntohl(u.i32[1]);
   u.i32[1] = ntohl(temp);
   return u.i64;
}

void Test(int64_t i)
{
   printf("Testing value %lli\n", i);
   int64_t networkI = htonll(i);
   printf("   Network format is %lli (0x%llx)\n", networkI, networkI);
   int64_t hostAgainI = ntohll(networkI);
   printf("   Back to host again %lli (0x%llx)\n", hostAgainI, hostAgainI);
   if (hostAgainI != i)
   {
      printf("ERROR, we didn't get the original value back!\n");
      abort();
   }
}

int main()
{
   // A quick unit test to make sure I didn't mess anything up :)
   int64_t i = 0;
   while(1)
   {
      Test(i);
      Test(-i);
      i += rand();
   }
   return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16375340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档