2016-04-12 10 views
1

Ich versuche, an einem einfachen Bildverschlüsselungsprojekt zu arbeiten, und ich habe ein paar Fragen, die ich stellen möchte.C++ lesen und bearbeiten jpg-Datei mit ifstream

  1. Soll ich jedes Byte von Daten von ifstream in ein Zeichen, wie ich in meinem Code tat?

  2. Jedes gedruckte Byte ist ein seltsames Symbol (was korrekt ist), aber warum führt das Hinzufügen von 10 (ein int) dazu immer zu einer Zahl beim Drucken?

    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; 
    } 
    

Ausgang:

Original: å 
Result after adding: -112 

Original: Æ 
Result after adding: -100 

Original: 
Result after adding: 12 

Wie Sie sehen können, 10 Hinzufügen führt immer zu einer Zahl. Wie inkrementiere ich diese Werte richtig, damit ich sie später wieder ändern kann?

Vielen Dank für jede Hilfe.

+0

Nur zur Klarstellung, Sie machen eigentlich nichts mit den eigentlichen JPEG-Bilddaten? Es ist einfach so, dass Ihre Eingabedatei eine JPEG-Bilddatei ist? –

Antwort

2

Wenn Sie eine arithmetische Operation zu tun (wie Addition) mit einem Wert von einem Typ, der kleiner ist als int (wie char in Ihrem Fall) ist, dann wird dieser Wert seines zu int gefördert und der Betrieb erfolgt über zwei int Werte.

So entspricht der Ausdruck static_cast<int>(data[i]) + 10.

Lesen Sie mehr über integral promotion und arithmetic operator conversions.


Was, wie Ihr Problem zu lösen, müssen Sie zunächst sicherstellen, dass das Ergebnis der Operation paßt tatsächlich in einem char. Was ist, wenn das Byte, das Sie gelesen haben, 127 ist und Sie 10 hinzufügen? Dann ist das Ergebnis außerhalb der Grenzen einer signed char (was zu sein scheint, was Sie haben).

Wenn das Ergebnis nicht außerhalb der Grenzen, dann können Sie einfach es Stimmen:

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

Als kleine Randnotiz, wenn Sie binäre Daten gerade lesen Sie sind nicht wirklich lesen Zeichen, so empfehle ich die Verwendung eines fixed-with integer type wie int8_t oder uint8_t anstelle von char. Auf unterstützten Plattformen (die heutzutage fast alle vorhanden sind) sind sie nur Aliase für signed char und unsigned char (aber), aber die Verwendung der Aliase ist für die Leser Ihres Codes informativer.