我有一个任务,我不知道我应该做什么。这是任务:
编写以下函数: 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 ?我很困惑。
答案 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 char
或uint8_t
等而不是char
,但您的签名是定义的原样。
名称codingToShortString
具有误导性,因为没有创建字符串(并且没有0终止)。
糟糕的名字,糟糕的类型......我说这不是一个非常好的任务......