函数将十六进制字符串转换为ASCII值
我试图修改这个答案中的代码 因此,我有一个函数,可以将十六进制字符串转换为ASCII值,这些值存储在输出缓冲区中 我试图使用snprintf,但我遇到了一个分段错误。在GDB中,我得到了函数将十六进制字符串转换为ASCII值,c,C,我试图修改这个答案中的代码 因此,我有一个函数,可以将十六进制字符串转换为ASCII值,这些值存储在输出缓冲区中 我试图使用snprintf,但我遇到了一个分段错误。在GDB中,我得到了 st=error reading variable: Cannot access memory at address 0x726f6445> out=error reading variable: Cannot access memory at address 0x726f6441> 这是我的密码
st=error reading variable: Cannot access memory at address 0x726f6445>
out=error reading variable: Cannot access memory at address 0x726f6441>
这是我的密码:
#include <stdio.h>
#include <string.h>
int hex_to_int(char c)
{
if (c >= 97)
c = c - 32;
int first = c / 16 - 3;
int second = c % 16;
int result = first * 10 + second;
if (result > 9) result--;
return result;
}
int hex_to_ascii(char c, char d){
int high = hex_to_int(c) * 16;
int low = hex_to_int(d);
return high+low;
}
void hs(const char *st, char *out)
{
//const char* st = "6665646F7261";
int length = strlen(st);
int i;
char buf = 0;
int offset = 0;
for(i = 0; i < length; i++){
if(i % 2 != 0){
//printf("%c", hex_to_ascii(buf, st[i]));
offset += snprintf(out + offset, 255 - offset, ":%c", hex_to_ascii(buf, st[i]));
}else{
buf = st[i];
}
}
}
int main(){
char str;
hs("6665646F7261",&str);
printf("%c\n", str);
}
我希望以十六进制发送函数hs input 6665646F7261,并以fedora返回ASCII值。这将十六进制对转换为ASCII值,并将其存储在缓冲区中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define TARGET_SIZE(input) \
((strlen(input) / 2) + 1)
void convert(char *buffer, char *input) {
// This version is a little better but we still rely on the caller
// to give us a large enough buffer
char storage[3];
int offset = 0;
assert(strlen(input) % 2 == 0);
for (int index = 0; index < strlen(input); index+= 2) {
storage[0] = input[index];
storage[1] = input[index + 1];
storage[2] = 0;
// Now we handle upper and lower case hex values
buffer[offset] = strtoul(storage, NULL, 16);
offset++;
}
buffer[offset] = 0;
}
int main(void) {
char fedora[] = "6665646F7261";
char buffer[TARGET_SIZE(fedora)];
convert(buffer, fedora);
printf("%s\n", buffer);
return 0;
}
简单地提供没有文档或解释的代码,而不解释原始代码的错误,不是一个好的答案。我知道。应关闭并删除此问题。然而,如果OP只需要完成他的家庭作业,这将完成它。另外,原来的问题有太多错误,我不知道从哪里开始。如果您查看建议的副本,操作代码似乎基于其中一个答案。是的,此代码基于重复的问题,但主要区别是我想调用转换函数并将结果返回到main,而不是在转换函数中打印结果,是,重新阅读您的问题后,我意识到您希望将值存储在中间缓冲区中。我修改了答案。我甚至没有试图修复你的原始代码,因为它有太多的问题。我的答案也需要改进,但这看起来像是家庭作业。谢谢你,大卫,这很完美,我不知道如何解释我的问题以使问题更清楚,但这不是一个家庭作业,只是一个家庭爱好。主函数创建一个变量,该变量只能容纳一个字符,并将其地址传递给一个函数,该函数尝试在其中存储字符串。那不行。
fedora