C++:将无符号长整型转换为字符向量,反之亦然

4

请问如何将unsigned long long int转换为向量,反之亦然。

将unsigned long long int转换为向量,我尝试了以下方法:

unsigned long long int x;
vector<char> buf(sizeof(x));
memcpy( &buf[0], &x, sizeof( x ) );

当我测试x = 1234567890时,它失败了。但是当我尝试较小的值(比如1-100)时,它可以正常工作...

将向量转换为无符号长整型int,我使用以下代码:

   unsigned long long int =  (unsigned long long int)buf[0];

有没有人能告诉我怎么做呢?


是的,我正在尝试将整数分割成vector<char>,以便我可以从客户端发送它到服务器并读取它的返回。 - veda
如果你想这样做,你应该考虑将Mark B的解决方案合并到模板函数中,这些函数可以安全地将任何大小的类型写入/读取到你的vector<char>中。 - Benj
3个回答

7
只要记住,简单地复制字节是无法实现跨平台的。您的 memcpy 看起来很好,那么为什么不在返回时重新创建它呢?您所编写的代码只是取出向量的第一个字节并将其转换为 unsigned long long,这就解释了为什么它适用于小数字。
请尝试使用以下代码从向量中获取值:
unsigned long long int x;
memcpy(&x, &buf[0], sizeof(x));

2
嘿嘿,如果你在大端系统上尝试他当前的方法,只有在 x 值非常大的情况下 buf[0] 才会包含任何内容。 - Benj

4

你可以使用std::vector::assign来执行拷贝,而不是直接将数据拷贝到向量中。

#include <iostream>
#include <vector>

int main()
{
  unsigned long long int x = 0x0807060504030201;
  std::vector<char> v;

  v.assign( reinterpret_cast<char *>( &x ), reinterpret_cast<char *>( &x ) + sizeof( x ) );

  for( auto i = v.begin(); i != v.end(); ++i ) {
    std::cout << std::hex << static_cast<int>( *i ) << ' ';
  }
  std::cout << std::endl;

  // To convert back
  auto y = *reinterpret_cast<unsigned long long int *>( &v[0] );
  std::cout << "y = " << std::hex << std::showbase << y << std::endl;

  return 0;
}

输出:

1 2 3 4 5 6 7 8 
y = 0x807060504030201

如何以相反的顺序保存它,我的意思是打印输出将是8 7 6 5 4 3 2 1? - rank1
1
@cygi1989 使用std::reverse。在v.assign(...);之后添加std::reverse(v.begin(), v.end()); - Praetorian
太好了。是否可以将它分配给最小可能的向量?假设我有一个函数,返回存储给定整数所需的最小字节数。我该怎么做? - rank1
@cygi1989,我不确定你在问什么。为什么不再发一个问题呢? - Praetorian

3

您需要更改最后一行:

memcpy( &buf[0], reinterpret_cast<char*>(&x), sizeof( x ) );

编辑 我在胡扯,那一行代码本来就没问题,但是你的转换回去的方式有问题 - 你转换了值,而不是指针:

unsigned long long int val = *reinterpret_cast<unsigned long long int*>(&buf[0]);

@MarkB:我也意识到了这一点——有一瞬间感到困惑。 - Björn Pollex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接