簡體   English   中英

以整數存儲數組中的位

[英]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種選擇:

  1. 解碼器預先知道消息長度。

  2. 消息長度類似地隱藏在某個已知位置,以便解碼器可以提取它。 例如,16位以二進制形式表示消息長度,該長度隱藏在bitArray的前16個像素中。

  3. 您使用消息結束標記,在該標記處您將繼續提取位,直到遇到簽名序列,該信號通知您停止。 例如,連續八個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM