[英]Storing bits from an array in an integer
所以我有一個字符數組,基本上是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}
1,0,1,1,0,0,1 {1, 0, 1, 1, 0, 0, 1}
的一系列位。 我想將其存儲在另一個數組中的整數中。 我聽說過整數有未使用的空間或其他東西。
供參考:整數值為rgb配色方案中的紅色值。
編輯:要使用此字符串,我會將字符串存儲在整數值中,以后以相同的方式進行解碼以檢索消息(隱寫術)。
因此,您想用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;
}
這會將字符串轉換為等效的int。
char string[] = "101010101";
int result = 0;
for (int i=0; i<strlen(string); i++)
result = (result<<1) | string[i]=='1';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.