2009-06-08 39 views
7

में स्ट्रिंग अक्षर में गैर-ASCII वर्णों को इंजेक्ट कैसे करें मेरे पास एक प्रोग्राम है जो एक वर्ण सरणी में पढ़ता है। मुझे हेक्स 0x01020304 के बराबर होने के लिए स्मृति में स्ट्रिंग के मान की आवश्यकता है जो सभी गैर-ASCII वर्ण हैं। तो सवाल यह है कि, मैं रन-टाइम पर स्ट्रिंग अक्षर परिवर्तक में गैर-ASCII वर्ण कैसे पास करूं?सी/सी ++

+0

यह सी या सी ++ प्रश्न नहीं है, यह एक टर्मिनल प्रश्न है। आपको यह पता लगाना होगा कि इसे अपने विशिष्ट टर्मिनल के साथ कैसे किया जाए। 0x03 विशेष रूप से समस्याग्रस्त साबित हो सकता है क्योंकि इसे भेजने से अक्सर प्रक्रिया समाप्त हो जाती है। – Don

+0

@ डॉन: नियंत्रण टर्मिनल को सौंपी गई एक सीधी 0x03, लेकिन डेटा इनपुट विधि (कीबोर्ड के माध्यम से मूल्यों में टाइप करने) के आधार पर हो सकती है। सवाल यह है कि ओपी इनपुट प्राप्त करने की अपेक्षा करता है। –

उत्तर

17

एक बचने का अनुक्रम का उपयोग करें। सुनिश्चित करें कि आप वर्णों को सही क्रम में रखें।

"\x01\x02\x03\x04" 

संपादित करें:। यदि आप एक मौजूदा चार सरणी में अनुक्रम में कहें, बस इसे आवंटित करने के लिए की जरूरत है

char s[4]; 

// ... later ... 
s[0] = 0x01; 
s[1] = 0x02; 
s[2] = 0x03; 
s[3] = 0x04; 

(int32_t *) को s कास्टिंग द्वारा संख्या आवंटित की कोशिश न करें, चार सरणी सही संरेखण नहीं है।

+1

यह काम करेगा अगर मैं अपने प्रोग्राम में मूल्यों को कोड कर रहा था, लेकिन मुझे रनटाइम पर उन्हें इनपुट करने में सक्षम होना चाहिए। क्षमा करें अगर सवाल पर्याप्त विशिष्ट नहीं था। –

+1

बेन, कृपया तदनुसार अपना प्रश्न अपडेट करें। – avakar

2

अच्छा, क्या आप वाकई एक स्ट्रिंग अक्षर की आवश्यकता है?

ये सब बहुत समान हैं:

const char* blah = "test"; 
char blah[] = "test"; 
char blah[] = { 't','e','s','t',0 }; 

आप निश्चित रूप से काफी आसानी से अपनी आवश्यकताओं के लिए तीसरे फार्म का उपयोग कर सकते हैं।

3

शायद सी में सबसे आसान, हेक्स से बचने का संकेत है: "\x01\x02\x03\x04"। (बिना एक्स, मूल्यों अष्टाधारी में है, जो आजकल लगभग के रूप में लोकप्रिय या समझ में आता नहीं है।)

वैकल्पिक रूप से

,

char x[] = {1, 2, 3, 4, 0}; 

(काम करना चाहिए नोटिस अशक्त समाप्ति जब आरंभ शामिल किया जाना है इस तरह)।

+0

यह काम करेगा अगर मैं अपने प्रोग्राम में मूल्यों को कोड कर रहा था, लेकिन मुझे रनटाइम पर उन्हें इनपुट करने में सक्षम होना चाहिए। क्षमा करें अगर सवाल पर्याप्त विशिष्ट नहीं था। –

+0

तो, आपका प्रश्न क्या है? उन्हें प्रोग्राम में कैसे पहुंचाया जाए? (इसका मतलब शायद आपके पर्यावरण का वर्णन करना होगा।) कार्यक्रम में उन्हें एक बार कैसे स्थानांतरित करें? –

2

मुझे हेक्स 0x01020304 के बराबर होने के लिए स्मृति में स्ट्रिंग के मान की आवश्यकता है जो सभी गैर-ASCII वर्ण हैं।

सावधान रहना कैसे 4 contigious बाइट्स स्मृति में बाहर रखी हैं कि आपका सिस्टम बड़े endian या थोड़ा-endian है निर्भर करेगा। यदि आप 32 बिट फ़ील्ड कैसे काम करते हैं, इस बारे में आप परवाह करते हैं, तो बस चीजों को एक स्ट्रिंग में डालकर काम नहीं करेगा।

उदाहरण के लिए:

आप की कोशिश कर सकते के रूप में avakar पता चलता है:

char cString[5] = "\x01\x02\x03\x04"; 

या बस

cString[0] = 0x01; 
cString[1] = 0x02; 
... 

लेकिन आप समझ बनाने के लिए स्मृति में वास्तविक भौतिक लेआउट की उम्मीद करता है, तो :

// assuming unsigned int is 32 bits 
unsigned int* cStringAlias = rentirpret_cast<int*>(&cString[0]); 
std::cout << (*cStringAlias) 

सावधान रहें, आउटपुट इस बात पर निर्भर करेगा कि सबसे महत्वपूर्ण बाइट 0 वें स्थान या तीसरे स्थान पर रखा गया है या नहीं।

उत्पादन

0x01020304 

या

0x04030201 

अधिक के लिए, endianess के बारे में पढ़ा जा सकता है।

1

स्रोत को यूटीएफ 8 में सहेजें और सभी तारों को यूटीएफ -8 के रूप में देखें (या कुछ लाइन स्ट्रिंगफ्रूटएफ() का उपयोग करें)।

प्रत्येक बार जब आप एक सार्वभौमिक कोड पृष्ठ में काम नहीं करते हैं (हाँ, यूटीएफ -8 वास्तव में एक कोड पृष्ठ नहीं है ...) आप परेशानियों के लिए पूछ रहे हैं।

0

आप std::hex उपयोग करने का प्रयास कर सकते हैं:

int temp; 
char sentMessage[10]; 
     for(int i = 0; i < 10; ++i) 
     { 
      std::cin >> std::hex >> temp; 
      sentMessage[i] = temp; 
     } 

फिर आप प्रत्येक चरित्र, जैसे की हेक्साडेसिमल मान में टाइप करेंगे। 01 11 7 एफ एए

0

आप कंसोल के लिए यूनिकोड समर्थन के लिए std::wcin और std::wcout का उपयोग कर सकते हैं। हालांकि, मुझे यकीन नहीं है कि वे मानक का हिस्सा हैं या नहीं।

1

जब सी कोड लिखने, आप memcpy उपयोग कर सकते हैं() बाइनरी डेटा कॉपी करने के लिए:

memcpy(dest + offset, src, 4); 

तो src एक स्ट्रिंग है, तो आप शायद यह सही क्रम में मिलता है। यदि यह एक पूर्णांक (जैसे कि, uint32_t) है और आप एक विशिष्ट endianness की जरूरत है, आप memcpy() करने से पहले बाइट्स का क्रम उलटने की जरूरत हो सकती:

uint32_t src; 

... 

swap((unsigned char *) &src, 0, 3); 
swap((unsigned char *) &src, 1, 2); 

जहां स्वैप() द्वारा परिभाषित किया गया है आप। यदि आपको मशीन एंडियननेस वांछित आउटपुट एंडियननेस से मेल नहीं खाता है तो आपको यह केवल करना होगा।

आप कंपाइलर या सी लाइब्रेरी द्वारा निर्धारित कुछ निश्चित परिभाषाओं को देखकर अंत्येष्टि की खोज कर सकते हैं। कम से कम glibc (Linux) पर, endian.h ऐसी परिभाषाएं प्रदान करता है, और byteswap.h बाइट-स्वैपिंग फ़ंक्शन भी प्रदान करता है।

1

चूंकि आप इंजेक्शन के बारे में बात कर रहे हैं, इसलिए मैं आपको एक सुराग दूंगा (यह एक कोड इंजेक्शन के लिए उपयोगी है जो अकादमिक उद्देश्यों के लिए बफर ओवरफ्लो भेद्यता का फायदा उठाता है) ... आपको यूनिकोड को स्वीकार करने के लिए अपने टर्मिनल को कॉन्फ़िगर करना होगा (मेरे मैक में आप उन्हें डिफ़ॉल्ट रूप से लिख सकते हैं)।तो आप उदाहरण के लिए लिखते हैं जैसे ∫, जब आप यूनिकोड चरित्र दर्ज करते हैं, तो यह नियमित रूप से एक नियमित चार की तरह स्मृति में एक बाइट नहीं लेता है, इसमें अधिक बाइट्स (दो, तीन या चार बाइट्स हो सकते हैं), इसलिए यदि आपके पास सरणी

char v[4]; 

और यदि आप

gets(v); //insecure function to read 

का उपयोग करें और इस ∫ 4 बाइट लेता है कि स्मृति में वी इस मान से भर दिया जाएगा (दशमलव में) दर्ज करें:

-30 
-120 
-85 
0 

यदि आप इनमें से किसी भी एकल स्थिति को देखते हैं, तो उनमें से कोई भी प्रिंट करने योग्य ASCII नहीं है, यह कुछ कोड हो सकता है जो आप स्मृति में प्राप्त कर सकते हैं और प्रोग्राम को उसी बफर ओवरफ़्लो का शोषण करके स्टैक में रिटर्न डीआईआर को बदलकर हैकिंग करके इसे निष्पादित कर सकते हैं। भेद्यता जो देता है()। (कोड को एचएक्स संपादक में अपना प्रोग्राम खोलने के लिए यह देखने के लिए कि यह संकलित होने पर सबकुछ कैसा दिखता है)!

तो तुम सिर्फ सही यूनिकोड वर्ण है कि क्या आप एक फ़ाइल

इस लिंक किसी में मुद्रण द्वारा की जरूरत है कैसे स्मृति ढेर में आवंटित किया जाता है के विचार प्राप्त कर सकते हैं के साथ मेल खोजने के लिए http://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86/

(ऐसा लगता है कि @ बेन के पास अब भी कोई खाता नहीं है, लेकिन किसी भी ऐसे व्यक्ति के लिए जो सुरक्षित प्रोग्रामिंग सीख रहा है, उसे इसकी आवश्यकता है)

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