【问题标题】:Convert unsigned char array of characters to int C++将 unsigned char 字符数组转换为 int C++
【发布时间】:2018-08-01 17:04:11
【问题描述】:

如何将包含字母的无符号字符数组转换为整数。我已经尝试过了,但它最多只能转换四个字节。我还需要一种将整数转换回无符号字符数组的方法。

int buffToInteger(char * buffer)
{
    int a = static_cast<int>(static_cast<unsigned char>(buffer[0]) << 24 |
        static_cast<unsigned char>(buffer[1]) << 16 | 
        static_cast<unsigned char>(buffer[2]) << 8 | 
        static_cast<unsigned char>(buffer[3]));
    return a;
}

【问题讨论】:

标签: c++ type-conversion


【解决方案1】:

您似乎正在尝试使用for 循环,即一遍又一遍地重复一项任务,以获得不确定的步骤。

unsigned int buffToInteger(char * buffer, unsigned int size)
{
    // assert(size <= sizeof(int));
    unsigned int ret = 0;
    int shift = 0;
    for( int i = size - 1; i >= 0, i-- ) {
        ret |= static_cast<unsigned int>(buffer[i]) << shift;
        shift += 8;
    }
    return ret;
}

【讨论】:

  • 这可能很快导致比unsigned int的大小更大的转变,从而导致UB。
  • @OP 如果您的问题是转换语法,而不是一般的编程,那么您显然知道 for 循环是什么,所以要知道我的评论并不是要居高临下,而是对新手来说信息量很大。
  • @Someprogrammerdude 嗯,是的,但在这种情况下没有什么可做的。 long 也是有效的,但如果 OP 想要使用的不仅仅是几个字符,那么这是无用的努力,因为 C++ 根本无法存储这些整数。
  • 我认为ret = (ret &lt;&lt; 8) | *buffer++;会更简单,但不清楚OP是否需要这样的转换。
【解决方案2】:

我认为您要使用的方法称为哈希 - 将对象转换为唯一整数。问题是哈希不可逆。此哈希将为hash("WXYZABCD", 8)hash("ABCD", 4) 产生不同的结果。 @Nicholas Pipitone 的答案不会为这些不同的输入产生不同的输出。

一旦你计算了这个哈希,就没有办法取回原始字符串。如果您想保留原始字符串的知识,则必须将原始字符串保留为变量。

int hash(char* buffer, size_t size) {
    int res = 0;
    for (size_t i = 0; i < size; ++i) {
        res += buffer[i];
        res *= 31;
    }
    return res;
}

【讨论】:

    【解决方案3】:

    下面是如何将 char 数组的第一个 sizeof(int) 字节转换为 int:

    int val = *(unsigned int *)buffer;
    

    并在后面转换:

    *(unsigned int *)buffer = val;
    

    请注意,您的缓冲区必须至少是您的 int 类型大小的长度。你应该检查一下。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2018-03-27
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2020-10-11
      相关资源
      最近更新 更多