以整数形式存储数组中的位

时间:2016-01-25 10:44:00

标签: c arrays

所以我有一个位数组,基本上是0和#1,在字符数组中。

现在我要做的是将这些位存储在另一个数组(int数组)中的整数中,但我不确定如何执行此操作。

这是获取位的代码:

char * convertStringToBits(char * string) {
    int i;
    int stringLength = strlen(string);
    int mask = 0x80; /* 10000000 */
    char *charArray;
    charArray = malloc(8 * stringLength + 1);
    if(charArray == NULL) {
        printf("An error occured!\n");
        return NULL; //error - cant use charArray
    }

    for(i = 0; i < stringLength; i++) {
        mask = 0x80;
        char c = string[i];
        int x = 0;
        while(mask > 0) {
            char n = (c & mask) > 0;
            printf("%d", n);
            charArray[x++] = n;
            mask >>= 1; /* move the bit down */
        }
        printf("\n");
    }

    return charArray;
}

例如,它在数组{1, 0, 1, 1, 0, 0, 1}中获得一系列位。我想将它存储在我在另一个数组中的整数中。我听说过有未使用空间或其他东西的整数。

供参考:整数值是rgb颜色方案中的红色值。

修改 要使用它,我会将此字符串存储在整数值中,稍后将以相同的方式解码以检索消息(隐写术)。

2 个答案:

答案 0 :(得分:5)

所以你想用整数进行LSB替换,这是最简单的隐写术形式。

整数没有未使用的空间,只是更改LSB最多会将整数值改为1。因此,如果您正在查看像素,将其值改为1将不会被人眼注意到。在这方面,LSB持有冗余信息。

你玩过按位操作。您基本上想要清除整数的最后一位,并用其中一位的值替换它。假设您的整数范围在0到255之间,您可以执行以下操作。

pixel = (pixel & 0xfe) | my_bit;

修改:根据评论中的代码段,您可以实现此目的。

int x;
for (x = 0; x < messageLength; x++) {
    rgbPixels[x][0] = (rgbPixels[x][0] & 0xfe) | bitArray[x];
}

解码要简单得多,因为您需要做的就是读取每个像素的LSB值。这里的问题是你怎么知道要读取多少像素?您有3个选择:

  1. 解码器提前知道消息长度。

  2. 消息长度同样隐藏在某个已知位置,以便解码器可以提取它。例如,16位以二进制表示消息长度,隐藏在bitArray之前的前16个像素中。

  3. 您使用消息结束标记,在此处继续提取位,直到您点击一个表示您停止的签名序列。例如,连续八个0。您必须确保序列及其所需的时间长短,不能在您的位阵列中过早地遇到它。

  4. 所以说你已经分配了消息长度的大小。您可以像这样简单地提取您的位数组(在分配之后)。

    int x;
    for (x = 0; x < messageLength; x++) {
        bitArray[x] = rgbPixels[x][0] & 0x01;
    }
    

答案 1 :(得分:0)

这会将字符串转换为等效的int。

char string[] = "101010101";

int result = 0;

for (int i=0; i<strlen(string); i++)
    result = (result<<1) | string[i]=='1';