对于我的项目,我需要从SD卡读取一些单行文本,然后获取字符串中每个字符的十六进制或十进制值,并将这些值分组到数组中。
文本中没有空格,行以\ n
结尾我正在使用此代码将所有内容读入单个字符串!
String line = "";
while (dataFile.available() != 0)
{
line = dataFile.readStringUntil('\n');
if (line == "")
break;
}
为了以后的使用,我需要计算每个字符的十六进制值,这段代码应该迭代字符串并将其分组在一个数组中。
int lineSize = line.length();
uint8_t data[lineSize];
for (int i = 0; i < lineSize; i++)
{
data[i] = line.charAt(i);
}
我真的不知道这是否有效,但我怀疑我会得到实际的十六进制值......
价值观在某处,但我真的不知道如何访问它们!
结果应如下所示:
uint8_t data[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
答案 0 :(得分:1)
将十六进制 视为另一种格式,以显示存储在内存中的任何数据类型(uint8_t,或char或int ...)。在内存中,它的所有二进制或十六进制。只是取决于你想看它的方式。
例如:以下陈述:
long int A = 34;
uint8_t B = 34;
char C = 34;
int D = 34;
printf("0x%02x\n", 'A'); // surrounded with '' gives ASCII value of 65, then displayed in Hex
printf("0x%02x\n", A);
printf("0x%02x\n", B);
printf("0x%02x\n", C);
printf("0x%02x\n", D);
结果:
将任何字符串分解为其基本元素(char或uint8_t)并如上所示打印它们将产生类似的结果。
<强> 修改 强>:
对于此输入文件(在可执行文件目录中将其命名为in.txt):
lkjahldfkjghlskjhlskjhlakdjgglsjkahlkj4hl5k6jh67=83kjhlkjshdf8f7s698s7dfgbslfkjbg
并使用此代码:
int main(void)
{
FILE *fp;
char filename[]=".\\in.txt";
uint8_t c;
int length=0, i=0;
uint8_t *array;
//Get number of entries in file:
fp=fopen(filename, "r");
c= fgetc(fp);
while(c<255)
{
length++;
c= fgetc(fp);
}
fclose(fp);
//give array sufficient space
array = malloc(sizeof(uint8_t)*length);
fp=fopen(filename, "r");
//read file into array, and display as hexadecimal
c = fgetc(fp);
while(c<255)
{
array[i++]= c;
printf("0x%02x\n", c);
c = fgetc(fp);
}
fclose(fp);
getchar();//stop execution to view files (hit any key to exit)
return 0
}
您应该看到 此输出:(仅显示前20个左右的值...)
答案 1 :(得分:0)
C / C ++中的字符串已经是数组(即使被更高级别的类std::string
抽象)。数组元素是每个字符的字符值。你确定你不能只抓住字符串。c_str()(或。data())并使用它,可能还有一个演员?
答案 2 :(得分:0)
好吧,如果通过获取十六进制代码意味着获取这些字符的十六进制表示,您可以这样做 -
const String hexDigits = "0123456789abcdef";
char hex[2] = "";
hex[0] = hexDigits[ (int)line.at(i) / 16 ];
hex[1] = hexDigits[ (int)line.at(i) % 16 ];
例如,如果line.at(i) = A
,则hex
将为"41"
。