如何在字符串中存储ascii值为0而不终止它?

时间:2017-07-24 12:38:20

标签: c

将输入作为十六进制字符串,然后将其转换为C中的char字符串。十六进制字符串可以包含0x00,转换后转换为Ascii中的0。这会终止字符串。我必须将值存储在char字符串中,因为API使用它 到目前为止我的代码:

int hex_to_int(unsigned char c) {
    int first =0;
    int second =0;
    int result=0;
    if(c>=97 && c<=102)
        c-=32;
    first=c / 16 - 3;
    second =c % 16;
    result = first*10 + second;
    if(result > 9) result--;
        return result;
}
unsigned char hex_to_ascii(unsigned char c, unsigned char d){
    unsigned char a='0';
    int high = hex_to_int(c) * 16;
    int low = hex_to_int(d);
    a= high+low;
    return a;
}
unsigned char* HextoString(unsigned char *st){
    int length = strlen((const char*)st);
    unsigned char* result=(unsigned char*)malloc(length/2+1);
    unsigned char arr[500];
    int i;
    unsigned char buf = 0;
    int j=0;
    for(i = 0; i < length; i++)
    {
        if(i % 2 != 0)
    {
        arr[j++]=(unsigned char)hex_to_ascii(buf, st[i]);
    }
    else
    {
         buf = st[i];
    }
    }
    arr[length/2+1]='\0';
    memcpy(result,arr,length/2+1);
    return result;
}

2 个答案:

答案 0 :(得分:6)

您可以将任何值存储在char数组中。但是如果要存储值0x00,则不能在此数组上使用字符串函数。因此,您必须使用整数变量来存储要存储的数据的长度。然后,您可以编写使用此整数的函数。

答案 1 :(得分:0)

正如您现在提供的更多信息,我可以告诉您,您的函数没有剪切任何内容,因为它循环遍历您提供的整个C字符串,例如输入"0a12345600a0020b12"。 “问题”是,如果你想在转换后得到输出字符串的长度(strlen()),那么它将停在'\0',你将得到一个“错误”的长度原始输入字符串。

它很好地写在answer of Xaver中,保存长度信息和字符串以使用该长度,而不是像C strlen()这样的C字符串函数。

为了显示这一点并为了提供正确长度的信息,我在代码中添加了struct定义,定义了一个由size_t lenunsigned char* str组成的字符串类型HexString。使用附加长度信息,您可以处理0字节。此外,我对您的代码进行了一些更改,例如你不需要堆栈上的字符缓冲区arr

输入您的信息:"0a12345600a0020b12"
您将看到以下输出:<0a> <12> <34> <56> <00> <a0> <02> <0b> <12> <00>
如果你打印每个字符的C字符串十六进制。最后一个<00>是空终止。

查看here on ideone以获取实例。

代码:

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

typedef struct
{
   size_t         len; /* C-string length + '\0' */
   unsigned char* str;
} HexString;

int hex_to_int(unsigned char c)
{
   int first =0;
   int second =0;
   int result=0;
   if (c >= 97 && c <= 102) /* 97 = 'a'; 102 = 'f' */
      c -= 32;
   first  = c / 16 - 3;
   second = c % 16;
   result = first * 10 + second;
   if (result > 9) result--;
   return result;
}

unsigned char hex_to_ascii(unsigned char c, unsigned char d)
{
   unsigned char a = '0';
   int high = hex_to_int(c) * 16;
   int low  = hex_to_int(d);
   a = high + low;
   return a;
}

HexString HextoString(const char* const st)
{
   HexString result;
   size_t length = strlen(st);
   result.len = length/2+1;
   result.str = malloc(length/2+1);
   size_t i;
   size_t j = 0;
   unsigned char buf = 0;
   for (i = 0; i < length; i++)
   {
      if (i % 2 != 0)
      {
         result.str[j++] = hex_to_ascii(buf, st[i]);
      }
      else
      {
         buf = (unsigned char)st[i];
      }
   }
   result.str[length/2+1] = '\0';
   return result;
}

int main()
{
   size_t i;
   HexString hexString = HextoString("0a12345600a0020b12");
   for (i = 0; i < hexString.len; ++i)
   {
      printf("<%02x> ", hexString.str[i]);
   }

   free(hexString.str);

   return 0;
}
相关问题