如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]
Posted
技术标签:
【中文标题】如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]【英文标题】:How to load strings into elements of BYTE* array (C++) [duplicate] 【发布时间】:2018-07-24 20:05:00 【问题描述】:我有一个程序可以获取文件的内容并将其转换为十六进制。我想获取这些十六进制值并将它们存储为我称为 hexData 的unsigned char
数组的元素。我该怎么办?
我尝试将十六进制数据转换为string literal
(例如0x5A
)并将其转换为char*
,但是当我尝试运行代码时没有任何反应(没有输出,没有错误)。这似乎也是一种非常低效的方法。我把代码留在里面看看我的意思。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
typedef unsigned char BYTE;
typedef unsigned short int WORD;
int main()
ifstream ifd("C:\\Users\\Shayon Shakoorzadeh\\Documents\\test.txt", ios::binary | ios::ate);
int size = ifd.tellg();
ifd.seekg(0, ios::beg);
vector<char> buffer;
buffer.resize(size);
ifd.read(buffer.data(), size);
static BYTE hexData[100000] =
;
string tempStr;
char *tempChar;
const int N = 16;
const char hex[] = "0123456789ABCDEF";
char buf[N*4+5+2];
for (int i = 0; i < buffer.size(); ++i)
int n = i % N;
// little endian format
if (i > 0 && i < buffer.size()-1)
swap(buffer[i], buffer[i+1]);
// checks to see if at the end
if (n == 0)
memset(buf, 0x20, sizeof(buf));
buf[sizeof(buf) - 3] = '\n';
buf[sizeof(buf) - 1] = '\0';
unsigned char c = (unsigned char)buffer[i];
// storing the hex values
buf[n*3+0] = hex[c / 16];
buf[n*3+1] = hex[c % 16];
//encoded buffer
buf[3*N+5+n] = (c>=' ' && c<='~') ? c : '.';
//my attempt
tempStr = "0x" + string(1, hex[c / 16]) + string(1, hex[c % 16]);
tempChar = (char*)alloca(tempStr.size() + 1);
memcpy(tempChar, tempStr.c_str(), tempStr.size() + 1);
strcpy( (char*) hexData[i] , tempChar);
静态 BYTE hexData[] 数组需要具有如下所示的值:
0x5A, 0x00, 0x7F, 0x90, 0x8A,...
等等
任何帮助将不胜感激!
编辑:
让我说明一下,我无法将这些值存储到名为“hexData”的数组中。我已经从我的文件中获取了十六进制值,但只是作为字符串。我想将这些字符串转换为无符号字符,以便可以将它们放入我的 hexData 数组中。抱歉,我最初的问题措辞如此糟糕,但我不相信指出的重复问题能回答我的问题。
【问题讨论】:
为什么要将值转换为十六进制? 所有整数都是十六进制,或二进制,或以 10 为基数,或以任何你想使用的为基数。你只需要以不同的方式看待它们。 Take a look at thestd::hex
manipulator 以简单的方式打印十六进制数字。
你有什么理由不使用std::stringstream?
没有重复明确的答案。 OP 问题很笼统,并且不限于 ostream 解决方案。
@NeilButterworth 我有另一个函数将采用那些无符号字符并返回一个 crc-16 值。不过,我没有在这段代码中包含该函数。
【参考方案1】:
这是用十六进制表示字节值的方法
有用的格式说明符如下: %x - 输出为十六进制,例如:2d .. %02x - 用零填充,最少 2 个字符,例如:0e .. “0x%02x”表示:0x00。
void byte_to_hex_string(unsigned char decimal) // Print Hexadecimal
if (decimal < 256)
char hexstring[8] 0 ;
sprintf(hexstring, "0x%02x", decimal);
printf("%s\n", hexstring);
int main()
byte_to_hex_string('A');
return 0;
【讨论】:
以上是关于如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将C++中string类型的字符串赋给unsigned char数组
如何在 Visual C++ 中将字节数组转换为十六进制字符串?