Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符串转换为int32到十六进制并存储到缓冲区_C - Fatal编程技术网

C 如何将字符串转换为int32到十六进制并存储到缓冲区

C 如何将字符串转换为int32到十六进制并存储到缓冲区,c,C,我正在尝试将字符串转换为字符串,然后再转换为十六进制。例如,字符串值表示类似266的整数。我这样做的主要原因是,我将所有值存储在字符串中,并希望通过网络将它们发送到主机,因此我必须将所有值表示为十六进制。如果我将字符串“266”转换为int32,然后转换为十六进制“0x010a”并将十六进制值存储在缓冲区中,则缓冲区包含“30 31”而不是0x010a。下面是我的问题的一个运行示例 #include <stdio.h> /* printf */ #include <stdint

我正在尝试将字符串转换为字符串,然后再转换为十六进制。例如,字符串值表示类似266的整数。我这样做的主要原因是,我将所有值存储在字符串中,并希望通过网络将它们发送到主机,因此我必须将所有值表示为十六进制。如果我将字符串“
266
”转换为int32,然后转换为十六进制“
0x010a
”并将十六进制值存储在缓冲区中,则缓冲区包含“
30 31
”而不是0x010a。下面是我的问题的一个运行示例

#include <stdio.h> /* printf */
#include <stdint.h> /* int32_t*/
#include <stdlib.h> /* strtol, malloc */
#include <string.h> /* memcpy */

int integer_to_hex(
        char **out_hex,
        int *out_len,
        int32_t value)
{
    *out_len = 0;
    *out_hex = NULL;
    if ( value < 128 && value > -128)
    {
        *out_len = 1;
        *out_hex = malloc(*out_len);
        sprintf(*out_hex,"%02x", value & 0xff);
        return 0;
    }
    else if (value < 32767 && value > -32767)
    {
        *out_len = 2;
        *out_hex = malloc(*out_len);
        sprintf(*out_hex,"%04x", value);
        return 0;
    }
    return -1;
}

int main()
{
    char *value_str = "266";
    int32_t val_int = strtol(value_str,NULL,10);
    char *out_hex;
    int out_len;
    int ret_val = integer_to_hex(&out_hex, &out_len, val_int);
    printf("ret_val=%d\n", ret_val);
    printf("out=%s\n", out_hex);
    printf("out_len=%d\n", out_len);
    char *buffer = malloc(out_len);
    memcpy(&buffer, &out_hex, out_len);
    int i;
    for(i=0;i<out_len;i++)
        printf("buffer=%02x\n", buffer[i]);
    return 0;
}
您的问题似乎是一个根本性的误解,即数字可以存储为“十六进制”。计算机总是以二进制形式存储数字

以十六进制显示数字非常方便,因为一组四位二进制数字(位)正好匹配一个十六进制数字(
0
-
f

但是如果你想让计算机在屏幕上显示十六进制数字,唯一的方法就是将这些数字编码为字符。在典型的基于ASCII的实现中,每个字符占用八(!)位

当您读取数字266时,在
uint32\t
的低16位中存储的是

0000 0001 0000 1010
   0    1    0    a     (mapping to hex)
如果要显示此内容,需要字符
0
1
a
,这些字符在ASCII中编码为
30(0011 0000)
31(0011 0001)
61(0110 0001)
。带有
%x
格式说明符的
printf()
函数系列执行此转换。这给你

   3    0 |    3    1 |    3    0 |    6    1      (mapping to hex)
0011 0000 | 0011 0001 | 0011 0000 | 0110 0001      (four `char`)
问题中的代码现在获取该字符串的各个字节(解释为数字!),并再次转换为十六进制字符串

您的问题似乎是对数字可以“十六进制”存储的基本误解。计算机总是以二进制形式存储数字

以十六进制显示数字非常方便,因为一组四位二进制数字(位)正好匹配一个十六进制数字(
0
-
f

但是如果你想让计算机在屏幕上显示十六进制数字,唯一的方法就是将这些数字编码为字符。在典型的基于ASCII的实现中,每个字符占用八(!)位

当您读取数字266时,在
uint32\t
的低16位中存储的是

0000 0001 0000 1010
   0    1    0    a     (mapping to hex)
如果要显示此内容,需要字符
0
1
a
,这些字符在ASCII中编码为
30(0011 0000)
31(0011 0001)
61(0110 0001)
。带有
%x
格式说明符的
printf()
函数系列执行此转换。这给你

   3    0 |    3    1 |    3    0 |    6    1      (mapping to hex)
0011 0000 | 0011 0001 | 0011 0000 | 0110 0001      (four `char`)

问题中的代码现在获取该字符串的各个字节(解释为数字!),并再次转换为十六进制字符串

如果使用标准库函数,则从十进制数的字符串转换为十六进制数的字符串相当简单。只需从程序中删除大部分代码,您将得到以下结果:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define LARGE_ENOUGH (8+1)

int main (void) 
{
  const char str_dec[] = "266";
  char str_hex [LARGE_ENOUGH];

  int32_t binary = strtol(str_dec, NULL, 10);
  sprintf(str_hex, "%.4"PRIX32, binary);

  puts(str_hex);
}
#包括
#包括
#包括
#定义足够大的_(8+1)
内部主(空)
{
const char str_dec[]=“266”;
char str_hex[足够大];
int32_t binary=strtol(str_dec,NULL,10);
sprintf(str_十六进制,%.4”PRIX32,二进制);
puts(str_hex);
}

没有明显的理由需要使用malloc()

如果使用标准库函数,则从十进制数的字符串转换为十六进制数的字符串相当简单。只需从程序中删除大部分代码,您将得到以下结果:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define LARGE_ENOUGH (8+1)

int main (void) 
{
  const char str_dec[] = "266";
  char str_hex [LARGE_ENOUGH];

  int32_t binary = strtol(str_dec, NULL, 10);
  sprintf(str_hex, "%.4"PRIX32, binary);

  puts(str_hex);
}
#包括
#包括
#包括
#定义足够大的_(8+1)
内部主(空)
{
const char str_dec[]=“266”;
char str_hex[足够大];
int32_t binary=strtol(str_dec,NULL,10);
sprintf(str_十六进制,%.4”PRIX32,二进制);
puts(str_hex);
}

没有明显的理由需要使用malloc()

30 31
是ASCII中的前两个十六进制数字
0
1
。如果你把一个十六进制数字编码为字符,它需要一个完整的字节。你说的“十六进制”是什么意思?存储为十六进制字符串的数字?如果是这样,那么您的缓冲区分配就太小了。简言之,您的函数将数字转换为十六进制表示形式的字符串(不必说写越界!),然后查看字符串的各个字符,再次将其数字代码转换为十六进制表示形式。
int32\t val\u int=strtol(value\u str,NULL,10)这已经完成了所有工作。没有“int32”格式,也没有“hex”格式。程序中实际存在的仅有两种格式是文本(ASCII)和二进制<代码>strtol
将文本转换为二进制。那么你想做什么,把十进制字符串转换成二进制字符串?“十六进制”是什么意思?似乎是无缘无故地付出了很多努力-您可以通过网络发送字符串“266”
30 31
是ASCII中的前两个十六进制数字
0
1
。如果你把一个十六进制数字编码为字符,它需要一个完整的字节。你说的“十六进制”是什么意思?存储为十六进制字符串的数字?如果是这样,那么您的缓冲区分配就太小了。简言之,您的函数将数字转换为十六进制表示形式的字符串(不必说写越界!),然后查看字符串的各个字符,再次将其数字代码转换为十六进制表示形式。
int32\t val\u int=strtol(value\u str,NULL,10)这已经完成了所有工作。没有“int32”格式,也没有“hex”格式。程序中实际存在的仅有两种格式是文本(ASCII)和二进制<代码>strtol
将文本转换为二进制。那么你想做什么,把十进制字符串转换成二进制字符串?“hex”是什么意思?似乎是无缘无故地付出了很多努力-您可以通过网络发送字符串“266”