假设我有一个字符串str,它由默认为十六进制系统的字符组成(0-9,a-f):
string str="1234567890abcdef";
我还有一个空长的n长度数组(n已知):
unsigned char arr[n]
我想要做的是用str的值填充我的数组arr但是以下面显示的特定方式:
unsigned char arr[8] = {0x12U, 0x34U, 0x56U, 0x78U, 0x90U, 0xabU, 0xcdU, 0xefU};
如图所示,字符串str被分成更小的十六进制字符。我怎样才能实现它?分离的算法很简单,但我无法弄清楚如何将字符串更改为unsigned char以及如何在字符串的开头添加0x和在字符结尾处添加U.
答案 0 :(得分:2)
您的要求有些不清楚。以下程序是否执行您想要的操作?
#include <string>
#include <iostream>
#include <cstdio>
#include <iterator>
#include <algorithm>
void str2bin(const std::string& in, unsigned char out[])
{
const char* data = in.data();
const std::string::size_type size = in.size();
for(std::string::size_type i = 0; i < size; i+= 2) {
unsigned int tmp;
std::sscanf(data+i, "%02X", &tmp);
out[i/2] = tmp;
}
}
int main() {
unsigned char arr[8];
str2bin("1234567890abcdef", arr);
std::cout << std::hex;
std::copy(arr, arr+8, std::ostream_iterator<unsigned int>(std::cout, ", "));
std::cout << "\n";
}
答案 1 :(得分:1)
0x12U
实际上是unsigned int
,而不是char
。它碰巧适合一个字符。最重要的是,它是一个仅由编译器使用的文字。一旦进入内存,数字全部变为二进制 - 一系列位。
在这种情况下,您有一个包含十六进制数字的字符串。即每个字符仅代表4位。你需要解析它。一个简单的函数是sscanf
。格式说明符%2X
读取两个十六进制字符并将它们存储在单个int中。因此,您可以使用"%2X%2X%2X%2X%2X%2X%2X%2X"
读取8个整数,然后将每个整数复制到相应的unsigned char
。
答案 2 :(得分:0)
如果您需要不太具体的版本,也可以考虑delimited list builder模式。