gpt4 book ai didi

c++ - 将 HEX char 数组存储在字节数组中,而不更改为 ASCII 或任何其他内容

转载 作者:行者123 更新时间:2023-11-28 01:17:37 25 4
gpt4 key购买 nike

我的 char 数组是 "00000f01" 我希望它像 byte out[4]={0x00,0x00,0x0f,0x01}; 我尝试了@ChrisA 发送的代码,感谢他 Serial.println( b,HEX ); 准确显示了我需要的内容,但首先我无法访问此输出数组,因为当我尝试打印“输出”数组,它似乎是空的我也试过这段代码:

void setup() {
Serial.begin(9600);
char arr[] = "00000f01";
byte out[4];
byte arer[4];
auto getNum = [](char c){ return c ; };
byte *ptr = out;
for(char *idx = arr ; *idx ; ++idx, ++ptr ){
*ptr = (getNum( *idx++ ) << 4) + getNum( *idx );
}
int co=0;
//Check converted byte values.
for( byte b : out ){
Serial.println( co );
Serial.println( b,HEX );
arer[co]=b;
co++;
}
// Serial.print(getNum,HEX);
// Serial.print(out[4],HEX);
// Serial.print(arer[4],HEX);
/*
none of this codes commented above worked*/
}

void loop() {
}

但它也不起作用。请帮助我。

最佳答案

你的问题的标题让我相信你对 char 的理解缺失了一些东西。数组或您提出问题的方式。人们通常很难理解十六进制字符 或数字与内存中字节的表示形式之间的区别。快速解释:

在内部,所有内存都是二进制的。您可以选择以位、ASCII、十进制或十六进制来表示(即显示)它,但它不会改变存储在内存中的内容。另一方面,由于内存只是二进制的,字符总是需要字符编码。这可以是 unicode 或其他更奇特的编码,但通常它只是 ASCII。所以如果你想要一串字符,无论是拼出一个十六进制数还是一个句子或随机字母,它们都必须用 ASCII 编码。

现在可以很容易地解决问题的主体:

据我所知,没有办法“捕获”Serial.println( b,HEX ) 的输出务实地,所以你需要找到另一种方法来从十六进制字符进行转换。 getNum() lambda 提供了绝佳的机会。目前它什么都不做,但如果你调整它,那么字符 '0'变成数字0 , 和字符 'f'变成数字15 , 等等,你会一路顺风。

这是一种快速而肮脏的方法:

void setup() {
Serial.begin(9600);
char arr[] = "00000f01";
byte out[4];
byte arer[4];
auto getNum = [](char c){ return (c <= '9' ? c-'0' : c-'a'+10) ; };
byte *ptr = out;
for(char *idx = arr ; *idx ; ++idx, ++ptr ){
*ptr = (getNum( *idx++ ) << 4) + getNum( *idx );
}
int co=0;
//Check converted byte values.
for( byte b : out ){
Serial.println( co );
if(b < 0x10)
Serial.print('0');
Serial.println( b,HEX );
arer[co]=b;
co++;
}
}

void loop() {
}

我所做的就是修改getNum所以它返回 0对于 '0'15对于 'f' , 等等。它通过减去字符 '0' 的值来实现。来自字符'0'通过'9' , 或减去字符 'a' 的值来自字符'a'通过'f' .还好字符的值'0'通过'9'一次增加一个,来自 'a' 的字符也是如此至 'f' .请注意,如果您输入 'F',这将失败或其他东西,但它会为您展示的示例做。

当我在 Uno 上运行上面的代码时,我得到了这个输出:

0
00
1
00
2
0F
3
01

这似乎是你想要的。

结语

为了演示 C++ 中的打印函数如何让您误判打印内容的实际值,请考虑 cout版本:

如果我在 C++14 中编译并运行以下代码:

#include <iostream>
#include <iomanip>
#include <string>

typedef unsigned char byte;

int main()
{
char arr[] = "00000f01";
byte out[4];
byte arer[4];
auto getNum = [](char c){ return c ; };
byte *ptr = out;
for(char *idx = arr ; *idx ; ++idx, ++ptr ){
*ptr = (getNum( *idx++ ) << 4) + getNum( *idx );
}
int co=0;
//Check converted byte values.
for( byte b : out ){
std::cout << std::setfill('0') << std::setw(2) << std::hex << b;
arer[co]=b;
co++;
}
}

我得到这个输出:

00000f01 

似乎表明已经发生了从十六进制字符的转换。但这只是因为 cout忽略 std::hex和对待b作为要以 ASCII 打印的字符。因为字符串 "00000f01"'0'作为每对中的第一个字符,它恰好有一个十六进制值 (0x30),低位 nybble 值为零,(getNum( *idx++ ) << 4)碰巧什么都不做。所以b将包含每对中的原始第二个字符,当以 ASCII 打印时,它看起来像一个十六进制字符串。

关于c++ - 将 HEX char 数组存储在字节数组中,而不更改为 ASCII 或任何其他内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58114145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com