我正在做一個隱寫術項目,我從ppm文件中讀取字節並將最不重要的位添加到數組中。所以一旦讀入8個字節,我的數組中就會有8位,這應該等於隱藏消息中的某個字符。有沒有簡單的方法將0和1的數組轉換爲ASCII值?例如,數組:char bits[] = {0,1,1,1,0,1,0,0}
將等於't'。 Plain C簡單的方法將0和1的字符串轉換爲字符? Plain C
感謝您的所有答案。我會給這些一些鏡頭。
我正在做一個隱寫術項目,我從ppm文件中讀取字節並將最不重要的位添加到數組中。所以一旦讀入8個字節,我的數組中就會有8位,這應該等於隱藏消息中的某個字符。有沒有簡單的方法將0和1的數組轉換爲ASCII值?例如,數組:char bits[] = {0,1,1,1,0,1,0,0}
將等於't'。 Plain C簡單的方法將0和1的字符串轉換爲字符? Plain C
感謝您的所有答案。我會給這些一些鏡頭。
一個簡單for
迴路會工作 - 像
unsigned char ascii = 0;
unsigned char i;
for(i = 0; i < 8; i++)
ascii |= (bits[7 - i] << i);
有可能是做這一個更快的方法,但這至少是一個開始。
我不會將這些位存儲在一個數組中 - 我會或者用char來存儲它們。
所以,你開始爲0的字符值:char bit = 0;
當你得到第一位,或將其與你有什麼:bit |= bit_just_read;
繼續這樣做的每一個比特,適當地轉移;即在獲得下一位後,執行bit |= (next_bit << 1);
。等等。
讀完8位後,bit
將是合適的ASCII值,並且可以打印出來,或者做任何你想做的事情。
他的位是在另一個順序。你必須改變你的權力,否則,假設next_bit是永遠的,你總是以0x2結尾| bit_just_read –
我沒有看到OP提及這些位的順序,但是,我列出的算法必須根據順序進行調整;是的,每一步都必須將剩下的值移回另一位。 – mipadi
他在他的問題中做了一個僞指派。 char bits [] =「0,1,1,1,0,1,0,0」;顯然語法是可疑的,但對於't'是正確的,所以... –
我同意mipadi,不要在第一個數組中存儲,這是沒有意義的。由於您必須在讀取數組時循環或以其他方式跟蹤數組索引,因此您可以一次完成數組索引。也許這樣的事情?
bits = 0;
for (i = 0; i < 8; ++i) {
lsb = get_byte_from_ppm_somehow() & 0x01;
bits <<= 1 | lsb;
}
只要位端正確,這應該工作和編譯下來很小。 如果bit endian倒退,那麼您應該能夠將掩碼的初始值更改爲1,掩碼轉換爲< =,並且您可能需要將(0x0ff &掩碼)作爲do {},而條件爲編譯器不會做它應該用字節大小的變量。 不要忘記做一些事情的神奇功能,我在那裏包括我不知道你想什麼,或者你是怎麼做到的東西
#include <stdint.h> // needed for uint8_t
...
uint8_t acc, lsb, mask;
uint8_t buf[SOME_SIZE];
size_t len = 0;
while (is_there_more_ppm_data()) {
acc = 0;
mask = 0x80; // This is the high bit
do {
if (!is_there_more()) {
// I don't know what you think should happen if you run out on a non-byte boundary
EARLY_END_OF_DATA();
break;
}
lsb = 1 & get_next_ppm_byte();
acc |= lsb ? mask : 0; // You could use an if statement
mask >>= 1;
} while (mask);
buf[len] = acc; // NOTE: I didn't worry about the running off the end of the buff, but you should.
len++;
}
你真的是'「0,1,1,1,0 ,1,0,0" '?或者更像'{0,1,1,1,0,1,0,0}'的東西? – Gabe
是的,我的意思是大括號:P – Anon