所以我有一个位数组,基本上是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颜色方案中的红色值。
修改 要使用它,我会将此字符串存储在整数值中,稍后将以相同的方式解码以检索消息(隐写术)。
答案 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个选择:
解码器提前知道消息长度。
消息长度同样隐藏在某个已知位置,以便解码器可以提取它。例如,16位以二进制表示消息长度,隐藏在bitArray
之前的前16个像素中。
您使用消息结束标记,在此处继续提取位,直到您点击一个表示您停止的签名序列。例如,连续八个0。您必须确保序列及其所需的时间长短,不能在您的位阵列中过早地遇到它。
所以说你已经分配了消息长度的大小。您可以像这样简单地提取您的位数组(在分配之后)。
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';