2016-04-12 15 views
1

lfStream kullanarak. Benim kodunda olduğu gibiC okumak ++ ve düzenleme jpg dosyası basit bir görüntü şifreleme proje üzerinde çalışmaya çalışıyorum ve ben sormak istediğim birkaç soru var

  1. Bir karakterin içine ifstream gelen her veri byte saklamak mı?

  2. Her bir byte yazdırılan garip bir semboldür (bu doğrudur), ancak neden 10 (bir int) eklendiğinde, yazdırıldığında her zaman bir sayı sonuçlanır?

    int main() { 
    
        vector <char> data; // Stores each byte from image.jpg 
    
        ifstream fileIn("image.jpg", ios::binary); 
    
        int i = 0; // Used for accessing each item in data vector 
    
        while (fileIn){ 
    
          //Add each character from the image file into the vector 
          data.push_back(fileIn.get()); 
    
          cout << "Original: " << data[i] << endl; // Print each character from image.jgp 
    
          cout << "Result after adding: " << data[i] + 10 << endl; // This line is where I need help with 
    
          i++; 
    
          system("pause"); 
        } 
    
        fileIn.close(); 
    
        system("pause"); 
        return 0; 
    } 
    

Çıktı: Gördüğünüz gibi

Original: å 
Result after adding: -112 

Original: Æ 
Result after adding: -100 

Original: 
Result after adding: 12 

, 10 ekleyerek her zaman bir numara ile sonuçlanır. Bu değerleri daha sonra nasıl değiştirebilirim, böylece daha sonra değiştirebilir miyim?

Yardımlarınız için teşekkür ederiz. Eğer (sizin durumunuzda gibi char) den küçük int bir türde bir değerle (ekleme gibi) bir aritmetik işlem yaptığınızda

+0

, aslında gerçek JPEG resim verilerine şey yapmıyoruz? Sadece giriş dosyanız bir JPEG görüntü dosyası mıdır? –

cevap

2

bu değer int için terfi ve operasyon iki int kullanılarak yapılır olacak değerler.

Yani ifadesi data[i] + 10 static_cast<int>(data[i]) + 10 eşdeğerdir.

daha yaklaşık integral promotion ve arithmetic operator conversions okuyun.


sorunu çözmek için nasıl gelince, öncelikle işlemin sonucu aslında char sığar emin olmak gerekir. Ya okuduğunuz bayt 127 ise ve 10 ekler misiniz? Daha sonra sonuç, signed char'un sınırlarını aştı (ki sahip olduğunuz gibi görünüyor). Sonuç sınırların dışında değil ise

, o zaman sadece yayınlayabileceğim:

char result = static_cast<char>(data[i] + 10); 

küçük bir yan not olarak, size gerçekten karakter okumuyorsun ikili veri okuyorsanız, char yerine fixed-with integer type gibi int8_t veya uint8_t kullanmayı öneririm. Desteklenen platformlarda (tüm bu günlerde olan), bunlar sadece signed char ve unsigned char için takma adlardır (sırasıyla) ve diğer adların kullanılması kodunuzun okuyucuları için daha bilgilendiricidir. Sadece açıklama