0

虽然我知道如何将一个字节从一个字节复制到另一个字节(如此处所述:Link),但我遇到了一个问题,即从一个字节到另一个数组的另一个字节的完整 4 位移位(尤其是最多 106 个字节)。

我在这里读到,如何一次移动两个半字节(单个字节),我也尝试实现它:

  char *input = (char *)malloc(sizeof(int));
  char gen_message[strlen(input) + 1];
  for(int loop = (strlen(input) - 1); loop >= 0; loop--)
  {
    ((gen_message[(loop + 1)]) & 0xF0) = ((*input[loop]) & 0x0F);
    ((gen_message[loop]) & 0x0F) = ((*input[loop]) & 0xF0);
  }
  gen_message[0] & 0xF0 = 0x4;

注意:输入可以在 1 到最多 106 个符号之间,因此是 malloc。

但是,我收到一个错误(一元'*'的参数类型无效),即使这样我也不确定它是否正确。

任何人都可以指出一个解决方案或可以解释我的脑残在哪里,以便我可以解决它?提前致谢!

-问候

4

1 回答 1

2

通常(忽略位域)C 不能存储小于 a 的任何内容char。要解决这个问题,您可以阅读整体char,修改其中的一部分,然后存储整体(修改后)char

请注意,在 C 中char可能是有符号的(例如,可能是范围为 -128 到 +127 的有符号八位字节);由于不确定性,这使得修改变得混乱(例如,未定义“有符号整数右移”的行为)。出于这个原因,我强烈建议使用unsigned charor uint8_t

要编写最低的半字节,您需要执行以下操作:

    dest = dest & 0xF0;        // Clear all bits in the low nibble
    dest = dest | new_nibble;  // Set new bits in the low nibble

要编写最高半字节,您需要执行以下操作:

    dest = dest & 0x0F;               // Clear all bits in the high nibble
    dest = dest | (new_nibble << 4);  // Set new bits in the high nibble

要阅读小食,您可以执行以下操作:

    low_nibble = src & 0x0F;
    high_nibble = (src & 0xF0) >> 4;

复制就是读然后写。例如,要将最低半字节复制src到最高半字节,dest您可以:

    nibble = src & 0x0F;
    dest = dest & 0x0F;             // Clear all bits in the high nibble
    dest = dest | (nibble << 4);    // Set new bits in the high nibble

对于数组元素,它可能看起来像这样:

    nibble1 = input[loop] & 0x0F;
    nibble2 = (input[loop] & 0xF0) >> 4;
    gen_message[loop + 1] = gen_message[loop + 1] & 0xF0;
    gen_message[loop + 1] = gen_message[loop + 1] | nibble1;
    gen_message[loop] = gen_message[loop] & 0x0F;
    gen_message[loop] = gen_message[loop] | (nibble2 << 4);

这也可以更简洁地完成:

    gen_message[loop + 1] &= 0xF0;
    gen_message[loop + 1] |= input[loop] & 0x0F;
    gen_message[loop] &= 0x0F;
    gen_message[loop] |= ((input[loop] & 0xF0) >> 4) << 4;

当然,如果知道目标已经包含零(例如由于memset()or calloc()),您可以跳过“清除半字节”部分:

    gen_message[loop + 1] |= input[loop] & 0x0F;
    gen_message[loop] |= ((input[loop] & 0xF0) >> 4) << 4;

编辑

其他评论员是对的——由于问题的数量,很难猜出你实际上想要做什么。我认为您可能(但可能不会)尝试做这样的事情:

unsigned char *shiftArray4Bits( unsigned char *srcArray ) {
    int srcLen = strlen(srcArray);
    unsigned char temp = 0;
    unsigned char *destArray;

    destArray = malloc(srcLen + 1);
    if(destArray == NULL) {
        return NULL;     // Failed to allocate memory
    }

    for(int i = 0; i < srcLen; i++) {
        dest[i] = temp | ((srcArray[i] & 0xF0) >> 4);
        temp = (srcArray[i] & 0x0F) << 4;
    }
    dest[i] = temp;
    return dest;
}
于 2018-12-23T02:45:24.167 回答