将输入作为十六进制字符串,然后将其转换为C中的char字符串。十六进制字符串可以包含0x00,转换后转换为Ascii中的0。这会终止字符串。我必须将值存储在char字符串中,因为API使用它 到目前为止我的代码:
int hex_to_int(unsigned char c) {
int first =0;
int second =0;
int result=0;
if(c>=97 && c<=102)
c-=32;
first=c / 16 - 3;
second =c % 16;
result = first*10 + second;
if(result > 9) result--;
return result;
}
unsigned char hex_to_ascii(unsigned char c, unsigned char d){
unsigned char a='0';
int high = hex_to_int(c) * 16;
int low = hex_to_int(d);
a= high+low;
return a;
}
unsigned char* HextoString(unsigned char *st){
int length = strlen((const char*)st);
unsigned char* result=(unsigned char*)malloc(length/2+1);
unsigned char arr[500];
int i;
unsigned char buf = 0;
int j=0;
for(i = 0; i < length; i++)
{
if(i % 2 != 0)
{
arr[j++]=(unsigned char)hex_to_ascii(buf, st[i]);
}
else
{
buf = st[i];
}
}
arr[length/2+1]='\0';
memcpy(result,arr,length/2+1);
return result;
}
答案 0 :(得分:6)
您可以将任何值存储在char数组中。但是如果要存储值0x00,则不能在此数组上使用字符串函数。因此,您必须使用整数变量来存储要存储的数据的长度。然后,您可以编写使用此整数的函数。
答案 1 :(得分:0)
正如您现在提供的更多信息,我可以告诉您,您的函数没有剪切任何内容,因为它循环遍历您提供的整个C字符串,例如输入"0a12345600a0020b12"
。 “问题”是,如果你想在转换后得到输出字符串的长度(strlen()
),那么它将停在'\0'
,你将得到一个“错误”的长度原始输入字符串。
它很好地写在answer of Xaver中,保存长度信息和字符串以使用该长度,而不是像C strlen()
这样的C字符串函数。
为了显示这一点并为了提供正确长度的信息,我在代码中添加了struct
定义,定义了一个由size_t len
和unsigned char* str
组成的字符串类型HexString
。使用附加长度信息,您可以处理0字节。此外,我对您的代码进行了一些更改,例如你不需要堆栈上的字符缓冲区arr
。
输入您的信息:"0a12345600a0020b12"
您将看到以下输出:<0a> <12> <34> <56> <00> <a0> <02> <0b> <12> <00>
如果你打印每个字符的C字符串十六进制。最后一个<00>
是空终止。
查看here on ideone以获取实例。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
size_t len; /* C-string length + '\0' */
unsigned char* str;
} HexString;
int hex_to_int(unsigned char c)
{
int first =0;
int second =0;
int result=0;
if (c >= 97 && c <= 102) /* 97 = 'a'; 102 = 'f' */
c -= 32;
first = c / 16 - 3;
second = c % 16;
result = first * 10 + second;
if (result > 9) result--;
return result;
}
unsigned char hex_to_ascii(unsigned char c, unsigned char d)
{
unsigned char a = '0';
int high = hex_to_int(c) * 16;
int low = hex_to_int(d);
a = high + low;
return a;
}
HexString HextoString(const char* const st)
{
HexString result;
size_t length = strlen(st);
result.len = length/2+1;
result.str = malloc(length/2+1);
size_t i;
size_t j = 0;
unsigned char buf = 0;
for (i = 0; i < length; i++)
{
if (i % 2 != 0)
{
result.str[j++] = hex_to_ascii(buf, st[i]);
}
else
{
buf = (unsigned char)st[i];
}
}
result.str[length/2+1] = '\0';
return result;
}
int main()
{
size_t i;
HexString hexString = HextoString("0a12345600a0020b12");
for (i = 0; i < hexString.len; ++i)
{
printf("<%02x> ", hexString.str[i]);
}
free(hexString.str);
return 0;
}