函数将十六进制字符串转换为ASCII值

函数将十六进制字符串转换为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> 这是我的密码

我试图修改这个答案中的代码

因此,我有一个函数,可以将十六进制字符串转换为ASCII值,这些值存储在输出缓冲区中

我试图使用snprintf,但我遇到了一个分段错误。在GDB中,我得到了

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