2012-06-26 14 views
5

पर डाला जाए मेरे पास एक कच्ची छवि फ़ाइल है जो बाइनरी डेटा (कोई एन्कोडिंग) में सहेजी गई है। मैं फ़ाइल में पढ़ना चाहता हूं और मानों को एक हस्ताक्षरित चार में डालना चाहता हूं। लेकिन मुझे यकीन नहीं है कि ऐसा करने के बारे में कैसे जाना शुरू करें। प्रत्येक फ़ाइल में 640x480 बाइट्स होते हैं। प्रत्येक पिक्सेल 8 बिट है।द्विआधारी डेटा में कैसे पढ़ा जाए और हस्ताक्षरित चार (सी ++)

मैंने यहां सी ++ सहायता पृष्ठ का उपयोग किया है: http://www.cplusplus.com/doc/tutorial/files/, हालांकि जब मैं डेटा को couting कर रहा हूं, ऐसा लगता है कि यह वही बाइनरी/गैर-मानव पठनीय पात्र दिखा रहा है। क्या कोई सलाह दे सकता है?

#include <iostream> 
    #include <fstream> 
    using namespace std; 

ifstream::pos_type size; 
char * memblock; 

int main() { 
    ifstream file ("imageData.raw", ios::in|ios::binary|ios::ate); 
    if (file.is_open()) 
    { 
    size = file.tellg(); 
    memblock = new char [size]; 
    file.seekg (0, ios::beg); 
    file.read (memblock, size); 

    cout << "the complete file content is in memory"; 

    for (int l=0; l<size; l++){ 
    cout << " memblock[] is = " << (unsigned char)memblock[l] << " index was l = " << l << endl; 
    } 

    file.close(); 


    delete[] memblock; 
    } 
    else cout << "Unable to open file"; 
    return 0; 
} 

यहाँ उत्पादन का एक नमूना पर कब्जा कर रहा है:

memblock[] is = ▀ index was l = 2937 
memblock[] is = E index was l = 2938 
memblock[] is = τ index was l = 2939 
memblock[] is = C index was l = 2940 
memblock[] is = ┘ index was l = 2941 
memblock[] is = B index was l = 2942 
memblock[] is = ╬ index was l = 2943 
memblock[] is = D index was l = 2944 
memblock[] is = ┼ index was l = 2945 
memblock[] is = C index was l = 2946 
memblock[] is = ╝ index was l = 2947 
memblock[] is = B index was l = 2948 
memblock[] is = ┤ index was l = 2949 
memblock[] is = B index was l = 2950 
memblock[] is = ¿ index was l = 2951 
memblock[] is = > index was l = 2952 
memblock[] is = í index was l = 2953 
memblock[] is = ; index was l = 2954 
memblock[] is = £ index was l = 2955 
memblock[] is = 6 index was l = 2956 
memblock[] is = á index was l = 2957 
memblock[] is = 4 index was l = 2958 
memblock[] is = Ñ index was l = 2959 
memblock[] is = 7 index was l = 2960 
memblock[] is = ╡ index was l = 2961 

उत्तर

8
unsigned char* memblock; // change declaration of memblock 

... 

memblock = new unsigned char[size]; // change to unsigned char 
file.seekg (0, ios::beg); 
file.read ((char*)memblock, size); // cast to a char* to give to file.read 

मुद्रण से पहले एक int लिए डाली अक्षरों के स्थान पर संख्यात्मक मान, मुद्रित करने के लिए यहाँ मेरी कोड अब तक है।

(int) memblock[l] 
+0

हम्म, मैथविज़, जो मुझे इसके बजाय एक int देता है। मैं इसे एक हस्ताक्षरित चार (0 से 255) में परिवर्तित करना चाहता हूं। क्या ऐसा करने का कोई तरीका नहीं है? क्या मुझे इसे केवल एक int में बदलने की ज़रूरत है? – c0d3rz

+0

अपेक्षित आउटपुट क्या है? क्या आप केवल एक संख्यात्मक मूल्य मुद्रित करने के लिए कास्टिंग कर रहे हैं? – trumank

+0

नहीं, मैं हस्ताक्षरित वर्णों से निपटना चाहता हूं। मुझे कच्ची छवियां मिलती हैं जो बाइनरी में सहेजी जाती हैं। मैं अपने सिर को उस गैर-पठनीय प्रारूप से निपटने के लिए लपेट नहीं सकता, इसलिए मैं बिना हस्ताक्षर किए गए वर्णों के साथ काम करना चाहता हूं ताकि मैं देख सकूं कि क्या हो रहा है। मैं केवल अभी के लिए डीबगिंग के लिए कास्टिंग था। लेकिन मैं अनिवार्य रूप से उन सभी मानों को बिना हस्ताक्षरित वर्णों में परिवर्तित करना चाहता हूं ... – c0d3rz

संबंधित मुद्दे