所以我有一个位数组,在字符数组中基本上是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颜色方案的红色值.
编辑: 要使用这个,我会将此字符串存储在整数值中,稍后将以相同的方式解码以检索消息(隐写术).
因此,您希望对整数进行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个选择:
解码器预先知道消息长度.
消息长度类似地隐藏在某个已知位置,以便解码器可以提取它.例如,16位以二进制表示消息长度,其隐藏在之前的前16个像素中bitArray.
您使用消息结束标记,在此处继续提取位,直到您点击一个表示您要停止的签名序列.例如,连续八个0.您必须确保序列及其所需的时间长度,不得在您的位数组中过早地遇到它.
所以说你已经分配了消息长度的大小.你可以简单地解压缩你的位数组(在分配之后).
int x;
for (x = 0; x < messageLength; x++) {
bitArray[x] = rgbPixels[x][0] & 0x01;
}
Run Code Online (Sandbox Code Playgroud)