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

mad*_*mma 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑: 要使用这个,我会将此字符串存储在整数值中,稍后将以相同的方式解码以检索消息(隐写术).

Ret*_*i43 5

因此,您希望对整数进行LSB替换,这是最简单的隐写形式.

并非整数具有未使用的空间,只是更改LSB最多会将整数值更改为1.因此,如果你正在观察像素,那么将它们的值改为1将不会被人眼所察觉.在这方面,LSB保存冗余信息.

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

pixel = (pixel & 0xfe) | my_bit;
Run Code Online (Sandbox Code Playgroud)

编辑:根据评论中的代码片段,您可以实现这一点.

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

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

  1. 解码器预先知道消息长度.

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

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

所以说你已经分配了消息长度的大小.你可以简单地解压缩你的位数组(在分配之后).

int x;
for (x = 0; x < messageLength; x++) {
    bitArray[x] = rgbPixels[x][0] & 0x01;
}
Run Code Online (Sandbox Code Playgroud)