文字に0と1つの文字列を変換する簡単な方法はありますか?平野C
質問
私はPPMファイルからバイトを読み込み、配列に最下位ビットを追加するステガノグラフィプロジェクトをやっています。 8つのバイトが読み込まれたらだから、私は隠されたメッセージの中でいくつかの文字に等しくなければならない私の配列の8ビットを、持っているでしょう。 ASCII値に0と1つの配列を変換する簡単な方法はありますか?例えば、配列:char bits[] = {0,1,1,1,0,1,0,0}
は「T」が等しくなります。 のプレーンC の
すべての答えてくれてありがとう。私はこれらのショットのいくつかを与えるつもりだ。
解決
シンプルfor
ループがうまくいく -
unsigned char ascii = 0;
unsigned char i;
for(i = 0; i < 8; i++)
ascii |= (bits[7 - i] << i);
はこれを行うにはより高速な方法があるかもしれませんが、これは、少なくともスタートです。
他のヒント
私は、配列内のビットを格納しないだろう - 。私は思いたり文字と
あなたが0のchar値で始めるので:char bit = 0;
あなたが最初のビットを取得し、またはIT:bit |= bit_just_read;
の各ビットと、適切にシフトすることをやり続けます。あなたは次のビットを取得した後、すなわち、bit |= (next_bit << 1);
を行います。など。
あなたが8ビットを読んだ後、bit
は、適切なASCII値になり、あなたはそれをプリントアウトしたり、それをあなたがやりたいものは何でもすることができます。
私はmipadiに同意し、種類無意味なのだと、最初の配列に格納し気にしないでください。あなたがループに持っているか、そうでない場合には、それを読みながら配列インデックスを追跡するので、あなたにも一度にそれを行う可能性があります。このような何か、おそらく?
bits = 0;
for ( i = 0; i < 8; ++i ) {
lsb = get_byte_from_ppm_somehow() & 0x01;
bits <<= 1 | lsb;
}
として長いビットエンディアンが正しいよう、これが動作し、かなり小さなダウンコンパイルする必要があります。 ビットエンディアンが逆方向であるなら、あなたは、= <<にマスクシフト1にマスクの初期値を変更することができるはずです、あなたは(0x0ff&マスク)を持っている必要があります{そうであるように}、条件付きながら、あなたのコンパイラの場合それは、バイトサイズの変数を持つことになっているもの行いません。 私はあなたが望むものを知っているか、しませんでしたどこが含まれる魔法の機能のために何かをすることを忘れないでください、あなたが何かをしたか。
#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++;
}