将字符串写入十六进制转换器

时间:2018-01-31 01:10:20

标签: c string hex

我尝试将字符串写入十六进制转换器并在转换中成功

input : abcde

但输出是字符串类型

Output : "6162636465"

我需要将转换后的值设置为以下形式:

uint8_t in[] = { 0x61, 0x62, 0x63, 0x64, 0x65}

如何将其从字符串切换到uint8

代码如下:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[] )
{
    unsigned char str[100],strH[200];
    int i,j;
    strcpy(str, argv[1]);
    //printf("Enter string: ");
    //scanf("%[^\n]s",str);

    printf("\nString is: %s\n",str);

    /*set strH with nulls*/
    memset(strH,0,sizeof(strH));

    /*converting str character into Hex and adding into strH*/
    for(i=0,j=0;i<strlen(str);i++,j+=2)
    {
        sprintf((char*)strH+j,"%02X",str[i]);
    }
    strH[j]='\0'; /*adding NULL in the end*/

    printf("Hexadecimal converted string is: \n");
    printf("%s\n",strH);


    return 0;
}

2 个答案:

答案 0 :(得分:2)

如果您要存储字节:

import pandas as pd

your_table = pd.DataFrame(put_your_table_array_here)

sorted_table = your_table.sort_values(by=['bin-lat', 'bin-lon'], ascending=True)

在来自0x61, 0x62, 0x63, 0x64, 0x65 的{​​{1}}数组中,您没有执行任何类型的十六进制转换,只是在数组中存储uint8_t的ASCII值。如果这是你的目标,你可以简单地通过将每个字符的值分配给你的数组来实现,例如:

abcde

a, b, c, d, e数组上方包含输入的ASCII值)

示例使用/输出

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>

int main (int argc, char **argv) {

    if (argc < 2) {
        fprintf (stderr, "error: insufficient input, %s <hexval>\n", argv[0]);
        return 1;
    }
    char *s = argv[1];
    size_t i = 0, 
        len = strlen (s);
    uint8_t bytes[len];

    for (i = 0; i < len; i++)
        bytes[i] = s[i];       /* simply store the ASCII value of each char */

    for (i = 0; i < len; i++)
        printf (" 0x%02" PRIx8, bytes[i]);
    putchar ('\n');

    return 0;
}

如果您需要验证字符并将其转换为&#34;十六进制&#34; 值,那么您只需将数字转换为小写,然后转换为uint8_t bytes[],只需指定$ ./bin/strtoasciibytes abcde 0x61 0x62 0x63 0x64 0x65 0-9商店s[i] - '0'。如果角色在转换为小写后不适合这些范围中的任何一个,那么它不是十六进制字符。 (并注意一个字节可以由2个字符组成)

如果您正在尝试,或者您是否确实需要将每个单个字符转换为十六进制而不是ASCII值,请告诉我。

答案 1 :(得分:1)

假设具有十六进制表示的字符串始终相同 长度和你有填充零:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>

uint8_t hexchar_to_dec(char x)
{
    if(x >= '0' && x <= '9')
        return x - '0';

    x = tolower(x);

    if(x >= 'a' && x <= 'f')
        return 10 + x - 'a';

    return 0;
}

int main(void)
{

    char hex[] = "6162636465";
    char *tmp_hex = NULL;

    uint8_t *in;

    size_t hexlen = strlen(hex);

    size_t in_size = hexlen / 2;

    // the padding zero is missing, adding at the
    // beginning
    if(hexlen % 2)
    {
        tmp_hex = calloc(hexlen + 2, 1);
        if(tmp_hex == NULL)
            return 1;
        *tmp_hex = '0';
        strcat(tmp_hex, hex);
        in_size++;
    } else
        tmp_hex = hex;



    in = calloc(in_size, sizeof *in);
    if(in == NULL)
    {
        if(tmp_hex != hex)
            free(tmp_hex);
        return 1;
    }

    for(size_t i = 0; i < hexlen; i = i+2)
        in[i/2] = 16*hexchar_to_dec(tmp_hex[i]) + hexchar_to_dec(tmp_hex[i+1]);

    for(size_t i = 0; i < in_size; ++i)
        printf("in[%lu] = 0x%02x\n", i, in[i]);

    free(in);
    if(tmp_hex != hex)
        free(tmp_hex);

    return 0;
}

由于ASCII码,我在'1' == '0' + 1使用了这个事实。我的 当十六进制字符串缺少填充0时,代码也会考虑到这一点。

输出:

in[0] = 0x61
in[1] = 0x62
in[2] = 0x63
in[3] = 0x64
in[4] = 0x65

修改

另一种方法是使用strtoulmemcpy

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>

uint8_t hexchar_to_dec(char x)
{
    if(x >= '0' && x <= '9')
        return x - '0';

    x = tolower(x);

    if(x >= 'a' && x <= 'f')
        return 10 + x - 'a';

    return 0;
}

int main(void)
{

    char hex[] = "6162636465";

    uint8_t *in;

    size_t hexlen = strlen(hex);

    size_t in_size = hexlen / 2;

    // the padding zero is missing, adding at the
    // beginning
    if(hexlen % 2)
        in_size++;

    if(sizeof(unsigned long int) < (in_size * sizeof *in))
    {
        fprintf(stderr, "Hex value too large for unsigned long int. Aborting\n");
        return 1;
    }

    in = calloc(in_size, sizeof *in);
    if(in == NULL)
        return 1;


    unsigned long int val = strtoul(hex, NULL, 16);
    memcpy(in, &val, in_size * sizeof *in);

    for(size_t i = 0; i < in_size; ++i)
        printf("in[%lu] = 0x%02x\n", i, in[i]);

    free(in);

    return 0;
}

这样做的缺点是in中的字节顺序取决于。{1}} 字节顺序。在我的电脑里,我得到了

in[0] = 0x65
in[1] = 0x64
in[2] = 0x63
in[3] = 0x62
in[4] = 0x61

修改

我已添加此支票

    if(sizeof(unsigned long int) < (in_size * sizeof *in))
    {
        fprintf(stderr, "Hex value too large for unsigned long int. Aborting\n");
        return 1;
    }

正如用户chux在评论中指出的那样,如果memcpy调用会溢出 unsigned long int的大小小于字节数 分配给in