दिलचस्प पोस्ट
किनारे पिक्सेल मानचित्र के आधार पर छवि विभाजन एलएलडी, एलडी और डी टाइप आइडेंटिफ़ायर के साथ एक आकार_टी चर के printf क्या यह गतिशील रूप से संकलन और सी # कोड टुकड़े निष्पादित करने के लिए संभव है? क्या Google एंड्रॉइड कभी भी .net का समर्थन करेगा? कोणीय निर्देश कैसे तत्व को एक विशेषता जोड़ने के लिए? एंड्रॉइड: एक ड्रायबल या पृष्ठभूमि छवि स्केल? OpenGraph या Schema.org? स्विंग जीयूआई में मान्य (), पुन: संशोधित () और अमान्य () के बीच का अंतर ज: आउटपुट टेक्स्ट नई लाइनों में \ r \ n वर्णों को नहीं तोड़ता है सी का उपयोग करते हुए बाइनरी प्रस्तुति में एक int मुद्रित करें टीएफ़.एनएन.मैक्स_पूल में 'सएम' और 'वैलिड' पैडिंग के बीच क्या अंतर है tensorflow? मैन्युअल रूप से नक्शा स्तंभ नाम वर्ग गुणों के साथ गतिशील रूप से एक जावास्क्रिप्ट फ़ाइल लोड मैं बिना किसी अनुमति के नए पर्ल मॉड्यूल का उपयोग कैसे कर सकता हूं? मैं jQuery के साथ कुकी कैसे सेट / अनसेट करूं?

एक एनएसडीटा को एनएसएसटीइंग हेक्स स्ट्रिंग में कनवर्ट कैसे करें?

जब मैं एक NSData ऑब्जेक्ट पर कॉल- -description करता हूं, तो मुझे -description ऑब्जेक्ट की बाइट्स की तरह एक हेक्स स्ट्रिंग दिखाई देती है:

 <f6e7cd28 0fc5b5d4 88f8394b af216506 bc1bba86 4d5b483d> 

मैं डेटा के इस प्रतिनिधित्व को प्राप्त करना चाहता हूँ (शून्य से लेफ्ट / जीटी कोट्स) एक इन-मेमोरी NSString ताकि मैं इसके साथ काम कर NSString .. मैं कॉल नहीं करना चाहता -[NSData description] और फिर बस ट्रिम करें एलटी / जीटी कोट्स (क्योंकि मुझे लगता है कि यह NSData के सार्वजनिक इंटरफेस की गारंटीकृत पहलू नहीं है और भविष्य में विषय परिवर्तन है)।

एक NSData ऑब्जेक्ट को NSString ऑब्जेक्ट (कॉलिंग के अलावा अन्य) में इस प्रतिनिधित्व को प्राप्त करने का सबसे आसान तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "एक एनएसडीटा को एनएसएसटीइंग हेक्स स्ट्रिंग में कनवर्ट कैसे करें?"

ध्यान रखें कि कोई String(format: ...) समाधान बहुत धीमा होगा (बड़े डेटा के लिए)

 NSData *data = ...; NSUInteger capacity = data.length * 2; NSMutableString *sbuf = [NSMutableString stringWithCapacity:capacity]; const unsigned char *buf = data.bytes; NSInteger i; for (i=0; i<data.length; ++i) { [sbuf appendFormat:@"%02X", (NSUInteger)buf[i]]; } 

अगर आपको कुछ और काम करने की आवश्यकता है तो यह कोशिश करें:

 static inline char itoh(int i) { if (i > 9) return 'A' + (i - 10); return '0' + i; } NSString * NSDataToHex(NSData *data) { NSUInteger i, len; unsigned char *buf, *bytes; len = data.length; bytes = (unsigned char*)data.bytes; buf = malloc(len*2); for (i=0; i<len; i++) { buf[i*2] = itoh((bytes[i] >> 4) & 0xF); buf[i*2+1] = itoh(bytes[i] & 0xF); } return [[NSString alloc] initWithBytesNoCopy:buf length:len*2 encoding:NSASCIIStringEncoding freeWhenDone:YES]; } 

स्विफ्ट 3 संस्करण

 extension NSData { var hexString: String? { let buf = bytes.assumingMemoryBound(to: UInt8.self) let charA = UInt8(UnicodeScalar("a").value) let char0 = UInt8(UnicodeScalar("0").value) func itoh(_ value: UInt8) -> UInt8 { return (value > 9) ? (charA + value - 10) : (char0 + value) } let hexLen = length * 2 let ptr = UnsafeMutablePointer<UInt8>.allocate(capacity: hexLen) for i in 0 ..< length { ptr[i*2] = itoh((buf[i] >> 4) & 0xF) ptr[i*2+1] = itoh(buf[i] & 0xF) } return String(bytesNoCopy: ptr, length: hexLen, encoding: .utf8, freeWhenDone: true) } } 

मैं समाधान पर सहमत हूं जो डिबगिंग के लिए आरक्षित होने वाले description को नहीं बुलाएगा, इसलिए अच्छी बात है और अच्छा प्रश्न 🙂

NSData के बाइट्स के माध्यम से लूप का सबसे आसान समाधान है और इसे से NSString बनाना है। [yourData bytes] तक पहुंचने के लिए [yourData bytes] का उपयोग करें, और एक NSMutableString में स्ट्रिंग का निर्माण करें।

एनएसडीएटीए की श्रेणी का उपयोग करके इसे लागू करने का एक उदाहरण है

 @interface NSData(Hex) -(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces; @end @implementation NSData(Hex) -(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces { const unsigned char* bytes = (const unsigned char*)[self bytes]; NSUInteger nbBytes = [self length]; //If spaces is true, insert a space every this many input bytes (twice this many output characters). static const NSUInteger spaceEveryThisManyBytes = 4UL; //If spaces is true, insert a line-break instead of a space every this many spaces. static const NSUInteger lineBreakEveryThisManySpaces = 4UL; const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces; NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0); NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen]; for(NSUInteger i=0; i<nbBytes; ) { [hex appendFormat:@"%02X", bytes[i]]; //We need to increment here so that the every-n-bytes computations are right. ++i; if (spaces) { if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"]; else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "]; } } return [hex autorelease]; } @end 

उपयोग:

 NSData* data = ... NSString* hex = [data hexRepresentationWithSpaces_AS:YES]; 

मुझे @ एरिक_ एग्नेर का सबसे अच्छा जवाब मिला। मैं इसे थोड़ा सा पुन:

 NSData *data = [NSMutableData dataWithBytes:"acani" length:5]; NSUInteger dataLength = [data length]; NSMutableString *string = [NSMutableString stringWithCapacity:dataLength*2]; const unsigned char *dataBytes = [data bytes]; for (NSInteger idx = 0; idx < dataLength; ++idx) { [string appendFormat:@"%02x", dataBytes[idx]]; } 

बस जोड़ना चाहती थी कि @ पैकेटकिट्स की विधि को स्विफ्ट 3 का इस्तेमाल करके बहुत सुंदर ढंग से लिखा जा सकता है क्योंकि Data अब एक संग्रह है।

 extension Data { var hex: String { var hexString = "" for byte in self { hexString += String(format: "%02X", byte) } return hexString } } 

या …

 extension Data { var hex: String { return self.map { b in String(format: "%02X", b) }.joined() } } 

या और भी …

 extension Data { var hex: String { return self.reduce("") { string, byte in string + String(format: "%02X", byte) } } } 

स्विफ्ट में आप एक एक्सटेंशन बना सकते हैं।

 extension NSData { func toHexString() -> String { var hexString: String = "" let dataBytes = UnsafePointer<CUnsignedChar>(self.bytes) for (var i: Int=0; i<self.length; ++i) { hexString += String(format: "%02X", dataBytes[i]) } return hexString } } 

तो आप बस का उपयोग कर सकते हैं:

 let keyData: NSData = NSData(bytes: [0x00, 0xFF], length: 2) let hexString = keyData.toHexString() println("\(hexString)") // Outputs 00FF 

दुर्भाग्य से एनएसडीटा से हेक्स का निर्माण करने के लिए कोई अंतर्निहित तरीका नहीं है, लेकिन अपने आप को करना आसान है सरल तरीका है कि केवल उत्तरार्द्ध बाइट्स को sprintf ("% 02x") में उत्तीर्ण करना और उन्हें NSMutableString में जमा करना है। एक तेज़ तरीका एक लुकअप तालिका का निर्माण करना होगा जो 4 बिट्स को हेक्स वर्ण में मैप करता है, और फिर उस तालिका में लगातार नाइबल्स को पास करें।

हालांकि यह ऐसा करने का सबसे कारगर तरीका नहीं है, यदि आप डीबगिंग के लिए ऐसा कर रहे हैं, तो एसएससीआरपीटीओ में एनएसडीटा पर एक श्रेणी है जिसमें ऐसा करने के दो तरीके शामिल हैं (कच्चे बाइट मानों के एनएसएसटीरिंग के निर्माण के लिए, और एक इसका एक सुंदर प्रतिनिधित्व दिखाता है)।

http://www.septicus.com/SSCrypto/trunk/SSCrypto.m

टिप्पणियों में एक स्विफ्ट 1.2 स्निपेट को देखते हुए, यहां स्विफ्ट 2 संस्करण है, क्योंकि अब सी के लिए सी स्टाइल को अब नापसंद किया गया है। यदि आप देखभाल करते हैं तो एमआईटी लाइसेंस और दो साधारण इकाई परीक्षणों के साथ सारांश दें

आपकी सुविधा के लिए यहां कोड है:

 import Foundation extension NSData { var hexString: String { let pointer = UnsafePointer<UInt8>(bytes) let array = getByteArray(pointer) return array.reduce("") { (result, byte) -> String in result.stringByAppendingString(String(format: "%02x", byte)) } } private func getByteArray(pointer: UnsafePointer<UInt8>) -> [UInt8] { let buffer = UnsafeBufferPointer<UInt8>(start: pointer, count: length) return [UInt8](buffer) } }