如何收拾在一个C程序unsigned char变量十六进制值?(How to pack a hexa

2019-09-17 07:36发布

我有一个十六进制值"F69CF355B6231FDBD91EB1E22B61EA1F"在一个字符串中,我使用在我的程序该值通过在unsigned char变量硬编码的值是这样的: unsigned char a[] = { 0xF6 ,0x9C ,0xF3 ,0x55 ,0xB6 ,0x23 ,0x1F ,0xDB ,0xD9 ,0x1E ,0xB1 ,0xE2 ,0x2B ,0x61 ,0xEA ,0x1F}; 是否有任何功能或我可以从一个字符串的值设为并把它变成一个无符号的变量在十六进制格式由包装它的任何其他方法?

Answer 1:

#include <stdio.h>
#include <ctype.h>

int hctoi(const char h){
    if(isdigit(h))
        return h - '0';
    else
        return toupper(h) - 'A' + 10;
}

int main(void){
    const char cdata[]="F69CF355B6231FDBD91EB1E22B61EA1F";
    unsigned char udata[(sizeof(cdata)-1)/2];
    const char *p;
    unsigned char *up;

    for(p=cdata,up=udata;*p;p+=2,++up){
        *up = hctoi(p[0])*16 + hctoi(p[1]);
    }

    {   //check code
        int i;
        for(i=0;i<sizeof(udata);++i)
            printf("%02X", udata[i]);
    }
    return 0;
}


Answer 2:

您可以使用字符串中的十六进制值转换为数值sscanf 。 如果你希望值的数组,那么你可以写一个函数输入字符串分成两个字符段,并使用sscanf每件转换。 (我没有做下一个永恒的,所以我不知道这是做一个好办法。)



Answer 3:

如果它是32个单十六进制值(16个字节,128位),只有这样,你可能需要看所提供的方法libuuid

libuuid是的一部分e2fsprogs包。 总之一些Linux发行版,Debian的例如船舶libuuid作为单独的程序包 。 要使用Debian的包为您的研究与开发,你还需要看看这里 。



Answer 4:

检查这个答案在做这个东西C ++使用sscanf()

对于Ç ,这将是这样的:

char *str           = "F69CF355B6231FDBD91EB1E22B61EA1F";
char substr[3]      = "__";    
unsigned char *a    = NULL;    
len                 = strlen(str);
a                   = malloc(sizeof(unsigned char)*(len/2)+1);
for (  i = 0; i < len/2; i++) {
    substr[0]       = str[i*2];
    substr[1]       = str[i*2 + 1];
    sscanf( substr, "%hx", &a[i] );
}
free(a);


Answer 5:

引进辅助功能data_lengthdata_get轻松遍历您的数据。 下面的程序转储上解压缩无符号的字符stdout ,每行一个:

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

/* htoi(H)
    Return the value associated to the hexadecimal digit H. */
int
htoi(char h)
{
  int a = -1;
  if(isdigit(h))
  {
    a = h - '0';
  }
  else
  {
    a = toupper(h) - 'A' + 10;
  }
  return a;
}

/* data_length(D)
    The length of the data stored at D. */
int
data_length(const char* d)
{
  return strlen(d) / 2;
}

/* data_get(D, K)
    Return the K-th unsigned char located encoded in d. */
unsigned char
data_get(const char *d, int k)
{
  return htoi(d[2*k]) * 0x10 +
    htoi((d+1)[2*k]);
}

int
main()
{
    const char cdata[]="F69CF355B6231FDBD91EB1E22B61EA1F";
    for(int i = 0; i < data_length(cdata); ++i)
    {
      printf("0x%02hhx\n", data_get(cdata, i));
    }
    return EXIT_SUCCESS;
}


文章来源: How to pack a hexadecimal value in an unsigned char variable in a C program?
标签: c hex packing