C

时间:2018-05-28 12:27:29

标签: c string binary bit masking

我有一个任务,我不知道我应该做什么。这是任务:

编写以下函数: char * encodingToShortString(char * dig_str);

该函数应该创建并返回一个新字符串 short_dig_str short_dig_str 中的每个字节将包含 dig_str 的两个连续字符的两个相应位四元组。 对于长度为n(长度,不是大小)的 dig_str short_dig_str 的长度对于偶数n为n / 2,对于奇数n为n / 2 + 1。 对于奇数n, short_dig_str 中的第一个四重奏与 dig_str 的任何数字都不匹配,并且其所有位都为零。

实施例: 对于 dig_str =“1234”,字符串 short_dig_str 将包含以下整数: 00010010 00110100

对于 dig_str =“51234”,字符串 short_dig_str 将包含以下整数: 00000101 00010010 00110100

(从左到右,最重要的,MSB,到最不重要的LSB)。

必须准确地将所需的内存空间分配给 short_dig_str 字符串。 可以假设有足够的内存用于分配。

我已经开始了这样的功能:

char* codingToShortString(char* dig_str)//let's imagine that dig_str[] = "12";
{
   char *short_dig_str;
   char temp;//0000 0000
   int n = strlen(dig_str);
   unsigned mask = 1<<3;//1111
   unsigned c; //bit counter
   if (n%2 == 0)
   {
     short_dig_str = malloc(((n/2)+1)*sizeof(char));
   }
   else
   {
     short_dig_str = malloc(((n/2)+2)*sizeof(char));
   }
   for (i=0; i<n; i++)
   {
     for (c=1; c<=4; c++)
      {
        temp = dig_str[i] & mask;
        temp <<= 1;
      }
   }
}

但后来我不知道该怎么办。我如何将二进制值放入 short_dig_str ?我很困惑。

1 个答案:

答案 0 :(得分:1)

首先看一下所需的输出:

  

示例:对于dig_str =“1234”,字符串short_dig_str将包含以下整数:00010010 00110100

     

对于dig_str =“51234”,字符串short_dig_str将包含以下整数:00000101 00010010 00110100

使用“整数”表示(无符号)字符。如果您将结果写为十六进制值,您将获得

  

“1234”=&gt; 0x12,0x34

     

“51234”=&gt; 0x05,0x12,0x34

您正在采用过于复杂的方法。 你不需要任何位掩码。

char* codingToShortString(char* dig_str)
{
  int n = strlen(dig_str);

  // Add 1 before dividing to "round up", add 1 for \0
  char *short_dig_str = malloc((n+1)/2 + 1);

  unsigned char digits;
  int out_pos = 0;  // Read index within input: "12345"
  int in_pos = 0;   // Write index within output: {0x01,0x23,0x34}

  // First handle odd number of digits
  // Foe even numbers no special treatment needed.
  if (n%2 != 0)
  {
    digits = dig_str[in_pos++] - '0';
    short_dig_str[out_pos++] = digit;
  }

  // Then handle remaining digits (as pairs!).
  for ( ; in_pos < n; )
  {
      digits  = (dig_str[in_pos++] -'0') << 4; // one digits in upper half ...
      digits |= dig_str[in_pos++] - '0';       // ... one digit in lower half

      // Store into result array...
      short_dig_str[out_pos++] = digits;
  }

  return short_dig_str;
}

由于返回的指针不是用作字符串而是用作存储2位小数的原始字节,因此它应该是unsigned charuint8_t等而不是char,但您的签名是定义的原样。

名称codingToShortString具有误导性,因为没有创建字符串(并且没有0终止)。

糟糕的名字,糟糕的类型......我说这不是一个非常好的任务......