当前位置: 首页 > 知识库问答 >
问题:

字符串中的C字节数组[重复]

唐焕
2023-03-14

给定一串十六进制字符,我想从这些字符中创建一个字节数组。例如,给定字符串“1A2B3C”,我希望我的数组包含0x1A、0x2B、0x3C。

我有它使用下面的代码工作,但希望看到一个更有效的方式这样做。

(此时已检查字符串长度等)。

// Go through the string

int k = 0;
stringstream s;
for (int i = 0; i < STRING_SIZE; i++)
{
    // Get 2 digits at a time and store in a temp variable

    s.str("");
    s << key[k++];
    s << key[k++];

    char temp[2];
    memcpy(temp, s.str().c_str(), 2);

    // Get the hex value and store in final array

    actualArray[i] = (unsigned char)strtol(temp, 0, 16);
}

共有3个答案

容阳焱
2023-03-14

您不需要通过stringstream来获取十六进制值。将chars直接映射到int,并使用位移位获得十六进制字符表示的十进制值。

unsigned int getInt(char c)
{
   if ( isdigit(c) )
   {
      return c-'0';
   }

   if ( c >= 'a' && c <= 'f' )
   {
      return (c - 'a' + 10);
   }

   if ( c >= 'A' && c <= 'F' )
   {
      return (c - 'A' + 10);
   }

   assert(false);

   // Keep the compiler happy.
   return 0;
}

并将其用作:

for (int i = 0; i < STRING_SIZE; i += 2)
{
    int hex = getInt(key[i]) << 4 + getInt(key[i+1]);
    // Add hex to the array where you wish to store it.
}
蓝宜
2023-03-14

你可以用这样的东西

#include <string>
#include <vector>
#include <cstdint>
#include <cassert>

std::uint8_t char_to_nibble(char c)
{
    assert((c>='0' && c<='9') || (c>='A' && c<='F'));
    if ((c >= '0') && (c <= '9'))
        return c-'0';
    else
        return c-'A' + 0xA;
}

void str2ba(const std::string &src, std::vector<std::uint8_t> &dst)
{
    assert(src.size() % 2 == 0);
    dst.reserve(src.size()/2);
    dst.clear();
    auto it = src.begin();
    while(it != src.end()) {
        std::uint8_t hi = char_to_nibble(*it++);
        std::uint8_t lo = char_to_nibble(*it++);
        dst.push_back(hi*16+lo);
    }
}
段干祺
2023-03-14

假设keystd::string循环的主体可以是:

actualArray[i] = (unsigned char)std::stol(key.substr(i*2, 2), 0, 16);

如果键是一个字符数组,它将是:

actualArray[i] = (unsigned char)std::stol(std::string(key + i*2, 2), 0, 16);
 类似资料:
  • 我有一个CLinux设备,我需要转换一些数据。输入类似于 我需要 这是我尝试过的代码,但它不能编译,因为sstream不在设备操作系统上。有人能给我另一个转换数据的解决方案吗?

  • 问题内容: 我正在制作一个基于Java中字符串处理的程序,其中需要从字符串数组中删除重复的字符串。在此程序中,所有字符串的大小均相同。 “数组”是一个字符串数组,其中包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码,必须删除重复的字符串,但是不能删除。 如何删除重复的字符串? 我正在使用以下代码。 问题答案: 这会工作 或者只使用a 而不是数组。

  • 我正在用Java制作一个基于字符串处理的程序,在这个程序中,我需要从字符串数组中删除重复的字符串。在这个程序中,所有字符串的大小都是相同的。 “数组”是一个字符串数组,包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码必须删除重复的字符串,但不会删除。 如何删除重复字符串? 我正在使用以下代码。

  • 问题内容: 如何从某个包含数字,字母等的字符串中获取字节数组?如果您熟悉Java,那么我正在寻找与getBytes()方法相同的功能。 我尝试了如下代码段: 但没有成功,因此将不胜感激。 PS:为什么我完全需要这个!好吧,我需要通过fputs()将字节数组发送到用Java编写的服务器… 问题答案: @Sparr是正确的,但是我想您期望像C#中那样的字节数组。它与Sparr的解决方案相同,但是您希望

  • 为什么数组不相等?我希望返回原始的字节数组。