我有一个字符数组说 char value []={'0','2','0','c','0','3'};
我想将其转换为字节数组,如 unsigned char val[]={'02','0c','03'}
这是在嵌入式应用程序中,因此我不能使用string.h函数。我怎样才能做到这一点?
在您谈到嵌入式应用程序时,我假设您想将数字保存为值而不是字符串/字符。因此,如果您只想将字符数据存储为数字(例如以整数形式),则可以使用sscanf。
这意味着您可以执行以下操作:
char source_val[] = {'0','A','0','3','B','7'} // Represents the numbers 0x0A, 0x03 and 0xB7
uint8 dest_val[3]; // We want to save 3 numbers
for(int i = 0; i<3; i++)
{
sscanf(&source_val[i*2],"%x%x",&dest_val[i]); // Everytime we read two chars --> %x%x
}
// Now dest_val contains 0x0A, 0x03 and 0xB7
但是,如果您想将其存储为字符串(如您的示例中所示),则不能使用,unsigned char
因为该类型也只有8位长,这意味着它只能存储一个字符。在单个(无符号)字符中显示“ B3”不起作用。
编辑:根据评论可以,目标是将传递的数据保存为数值。不幸的是,打开器的编译器不支持sscanf
这是最简单的方法。无论如何,由于(我认为)这是最简单的方法,因此我将保留答案的这一部分,并尝试在此编辑中添加更多自定义方法。
关于数据类型,实际上没有关系uint8
。即使我建议使用某种整数数据类型,也可以将数据存储到中unsigned char
。这里的问题是,您传递的数据是一个字符/字母,您想将其解释为数值。但是,角色的内部存储有所不同。您可以检查ASCII表,在其中可以检查每个字符的内部值。例如:
char letter = 'A'; // Internally 0x41
char number = 0x61; // Internally 0x64 - represents the letter 'a'
如您所见,大写和小写之间也存在差异。
如果您执行以下操作:
int myVal = letter; //
myVal将不代表值0xA(十进制10),它将具有值0x41。
您无法使用的事实sscanf
意味着您需要一个自定义函数。因此,首先我们需要一种将一个字母转换为整数的方法:
int charToInt(char letter)
{
int myNumerical;
// First we want to check if its 0-9, A-F, or a-f) --> See ASCII Table
if(letter > 47 && letter < 58)
{
// 0-9
myNumerical = letter-48;
// The Letter "0" is in the ASCII table at position 48 -> meaning if we subtract 48 we get 0 and so on...
}
else if(letter > 64 && letter < 71)
{
// A-F
myNumerical = letter-55
// The Letter "A" (dec 10) is at Pos 65 --> 65-55 = 10 and so on..
}
else if(letter > 96 && letter < 103)
{
// a-f
myNumerical = letter-87
// The Letter "a" (dec 10) is at Pos 97--> 97-87 = 10 and so on...
}
else
{
// Not supported letter...
myNumerical = -1;
}
return myNumerical;
}
现在,我们有一种方法可以将每个字符转换为数字。另一个问题是总是将两个字符附加在一起,但这很容易:
int appendNumbers(int higherNibble, int lowerNibble)
{
int myNumber = higherNibble << 4;
myNumber |= lowerNibbler;
return myNumber;
// Example: higherNibble = 0x0A, lowerNibble = 0x03; -> myNumber 0 0xA3
// Of course you have to ensure that the parameters are not bigger than 0x0F
}
现在,所有的一切将是这样的:
char source_val[] = {'0','A','0','3','B','7'} // Represents the numbers 0x0A, 0x03 and 0xB7
int dest_val[3]; // We want to save 3 numbers
int temp_low, temp_high;
for(int i = 0; i<3; i++)
{
temp_high = charToInt(source_val[i*2]);
temp_low = charToInt(source_val[i*2+1]);
dest_val[i] = appendNumbers(temp_high , temp_low);
}
希望我能正确理解您的问题,这对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句