我尝试将字符串写入十六进制转换器并在转换中成功
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;
}
答案 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
修改强>
另一种方法是使用strtoul
和memcpy
#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
。