通常(忽略位域)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;
}