طريقة سهلة لتحويل سلسلة من 0 و 1's إلى شخصية؟ عادي ج

StackOverflow https://stackoverflow.com/questions/2521237

  •  22-09-2019
  •  | 
  •  

سؤال

أقوم بمشروع Steganography حيث قرأت بايت من ملف PPM وأضيف أقل بتات إلى صفيف. لذلك بمجرد قراءة 8 بايت ، سيكون لدي 8 بت في صفيف بلدي ، والتي ينبغي أن تساوي بعض الأحرف في رسالة مخفية. هل هناك طريقة سهلة لتحويل صفيف من 0 و 1 إلى قيمة ASCII؟ على سبيل المثال ، المصفوفة: char bits[] = {0,1,1,1,0,1,0,0} سوف تساوي 't'. عادي ج

شكرا على كل الإجابات. سأعطي بعض هذه اللقطة.

هل كانت مفيدة؟

المحلول

بسيط 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 المناسبة ، ويمكنك طباعتها أو القيام بكل ما تريد القيام به.

وأنا أتفق مع Mipadi ، لا تهتم بالتخزين في صفيف أولاً ، هذا نوع من الأهمية. نظرًا لأنه يتعين عليك حلقة أو تتبع فهرس الصفيف أثناء قراءته ، يمكنك القيام بذلك أيضًا. شيء من هذا القبيل ، ربما؟

bits = 0;

for ( i = 0; i < 8; ++i ) {
    lsb = get_byte_from_ppm_somehow() & 0x01;
    bits <<= 1 | lsb;
}

طالما أن البت Endian صحيح ، يجب أن يعمل هذا وتجميعه صغيرًا جدًا. إذا كان البت Endian متخلفًا ، فيجب أن تكون قادرًا على تغيير القيمة الأولية للقناع إلى 1 ، وهو تحول القناع إلى << = ، وقد تحتاج لا تفعل ما يفترض أن يكون مع المتغيرات بحجم البايت. لا تنس أن تفعل شيئًا للوظائف السحرية التي قمت بتضمينها حيث لم أكن أعرف ما تريد أو كيف فعلت شيئًا

#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++;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top