একটি এনএসডিটা কে হেক্সাডেক্সিমাল স্ট্রিংয়ে সিরিয়াল করার সেরা উপায় way


101

আমি কোনও এনএসডাটা অবজেক্টকে হেক্সাডেসিমাল স্ট্রিংয়ে সিরিয়াল করার জন্য একটি দুর্দান্ত-কোকোয়ের সন্ধান করছি। ধারণাটি হ'ল আমার সার্ভারে প্রেরণের আগে বিজ্ঞপ্তির জন্য ব্যবহৃত ডিভাইস টোকেনকে সিরিয়ালাইজ করা।

আমার নিম্নোক্ত বাস্তবায়ন রয়েছে, তবে আমি ভাবছি এটি করার জন্য অবশ্যই কিছু ছোট এবং সুন্দর উপায় থাকতে হবে।

+ (NSString*) serializeDeviceToken:(NSData*) deviceToken
{
    NSMutableString *str = [NSMutableString stringWithCapacity:64];
    int length = [deviceToken length];
    char *bytes = malloc(sizeof(char) * length);

    [deviceToken getBytes:bytes length:length];

    for (int i = 0; i < length; i++)
    {
        [str appendFormat:@"%02.2hhX", bytes[i]];
    }
    free(bytes);

    return str;
}

উত্তর:


206

এটি এনএসডেটায় প্রয়োগ করা একটি বিভাগ যা আমি লিখেছি। এটি এনএসডিটা উপস্থাপন করে একটি হেক্সাডেসিমাল এনএসএস স্ট্রিং প্রদান করে, যেখানে ডেটা যে কোনও দৈর্ঘ্য হতে পারে। এনএসডিটা খালি থাকলে একটি খালি স্ট্রিং ফেরত দেয়।

NSData + + Conversion.h

#import <Foundation/Foundation.h>

@interface NSData (NSData_Conversion)

#pragma mark - String Conversion
- (NSString *)hexadecimalString;

@end

NSData + + Conversion.m

#import "NSData+Conversion.h"

@implementation NSData (NSData_Conversion)

#pragma mark - String Conversion
- (NSString *)hexadecimalString {
    /* Returns hexadecimal string of NSData. Empty string if data is empty.   */

    const unsigned char *dataBuffer = (const unsigned char *)[self bytes];

    if (!dataBuffer)
        return [NSString string];

    NSUInteger          dataLength  = [self length];
    NSMutableString     *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];

    for (int i = 0; i < dataLength; ++i)
        [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]];

    return [NSString stringWithString:hexString];
}

@end

ব্যবহার:

NSData *someData = ...;
NSString *someDataHexadecimalString = [someData hexadecimalString];

এটি "সম্ভবত" কল করা [someData description]এবং তারপরে স্পেস, <'s এবং> এর স্থানগুলি কেটে ফেলার চেয়ে ভাল । বিচ্ছুরিত চরিত্রগুলি কেবল "হ্যাকি" বোধ করে। প্লাস আপনি কখনই জানেন না অ্যাপল -descriptionভবিষ্যতে NSData এর বিন্যাসটি পরিবর্তন করবে কিনা ।

দ্রষ্টব্য: এই উত্তরে কোডটির লাইসেন্স দেওয়ার বিষয়ে আমার কাছে লোকেরা পৌঁছেছিল। আমি এইভাবে আমার এই প্রকাশ্যে সার্বজনীন ডোমেনের উত্তরে পোস্ট করা কোডটিতে আমার কপিরাইট উত্সর্গ করেছি।


4
চমৎকার, তবে দুটি পরামর্শ: (1) আমি মনে করি অ্যাপেন্ডফর্ম্যাটটি বৃহত ডেটার জন্য আরও কার্যকর কারণ এটি একটি মধ্যবর্তী এনএসটিস্ট্রিং তৈরি করা এড়িয়ে যায় এবং (২)% x স্বাক্ষরযুক্ত দীর্ঘ না হয়ে স্বাক্ষরযুক্ত ইন্টের প্রতিনিধিত্ব করে, যদিও পার্থক্যটি নিরীহ।
সোয়াচলেক

নায়সায়ার হওয়ার কথা নয়, যেহেতু এটি একটি ভাল সমাধান যা ব্যবহার করা সহজ তবে 25 জানুয়ারীর আমার সমাধানটি আরও কার্যকর more আপনি যদি কোনও পারফরম্যান্স অনুকূলিত উত্তর খুঁজছেন তবে সেই উত্তরটি দেখুন । একটি উত্তম, সহজে বোঝার সমাধান হিসাবে এই উত্তরটিকে সমর্থন করা।
এনএসপোগ্রামার

5
আমাকে (স্বাক্ষরযুক্ত দীর্ঘ) কাস্টটি অপসারণ করতে হবে এবং এই কাজটি করতে @ "% 02hhx" ফর্ম্যাট স্ট্রিং হিসাবে ব্যবহার করতে হবে।
আন্তন

1
ডানদিকে, প্রতি বিকাশকারী । অ্যাপ্লিকেশন"%02lx"(unsigned int)@"%02hhx"
লাইব্রেরি

1
[hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]];অনেক ভাল (ছোট মেমরির পদচিহ্ন)
মেরেক আর

31

একটি হেক্স স্ট্রিং উত্পন্ন করার জন্য এখানে একটি উচ্চতর অনুকূলিত এনএসডিটা বিভাগের পদ্ধতি। @ ডেভ গ্যালাগারের উত্তর তুলনামূলকভাবে ছোট আকারের জন্য যথেষ্ট, তথ্যের জন্য প্রচুর পরিমাণে মেমরি এবং সিপিইউর কার্যকারিতা খারাপ হয়ে যায়। আমি আমার আইফোন 5 এ 2 এমবি ফাইল দিয়ে এটি প্রোফাইল দিয়েছি Time সময়ের তুলনা ছিল 0.05 বনাম 12 সেকেন্ড। এই পদ্ধতির সাথে মেমোরির পদচিহ্ন নগণ্য, অন্য পদ্ধতিটি হিড়িকে grew০ এমবি করে নিয়েছে!

- (NSString *) hexString
{
    NSUInteger bytesCount = self.length;
    if (bytesCount) {
        const char *hexChars = "0123456789ABCDEF";
        const unsigned char *dataBuffer = self.bytes;
        char *chars = malloc(sizeof(char) * (bytesCount * 2 + 1));       
        if (chars == NULL) {
            // malloc returns null if attempting to allocate more memory than the system can provide. Thanks Cœur
            [NSException raise:NSInternalInconsistencyException format:@"Failed to allocate more memory" arguments:nil];
            return nil;
        }
        char *s = chars;
        for (unsigned i = 0; i < bytesCount; ++i) {
            *s++ = hexChars[((*dataBuffer & 0xF0) >> 4)];
            *s++ = hexChars[(*dataBuffer & 0x0F)];
            dataBuffer++;
        }
        *s = '\0';
        NSString *hexString = [NSString stringWithUTF8String:chars];
        free(chars);
        return hexString;
    }
    return @"";
}

সুন্দর একটি @ পিটার - এর চেয়ে আরও দ্রুত (আপনার এর চেয়ে বেশি নয়) সমাধান রয়েছে - ঠিক নীচে;)
মজ

1
@ মুজ, দয়া করে আরও সুনির্দিষ্টভাবে রেফারেন্স করুন যা আপনি যে উত্তরটির বিষয়ে কথা বলছেন: ভোট এবং নতুন উত্তরগুলি উত্তরের অবস্থানকে প্রভাবিত করতে পারে। [সম্পাদনা: ওহ, আমাকে অনুমান করতে দিন, আপনি নিজের উত্তরটি বোঝাচ্ছেন ...]
সিউর

1
Malloc নাল চেক যোগ করা হয়েছে। ধন্যবাদ @ সিউর
পিটার

17

NSData এর বর্ণনা বৈশিষ্ট্যটি ব্যবহার করে এইচএক্স স্ট্রিং এনকোডিংয়ের জন্য একটি গ্রহণযোগ্য প্রক্রিয়া হিসাবে বিবেচনা করা উচিত নয়। এই সম্পত্তিটি কেবল বর্ণনার জন্য এবং যে কোনও সময় পরিবর্তন হতে পারে। একটি নোট হিসাবে, প্রাক আইওএস হিসাবে, এনএসডিটা বিবরণ সম্পত্তি এমনকি হেক্স আকারে এটির ডেটা ফেরত দেয় না।

সমাধানটি ক্ষতিগ্রস্থ করার জন্য দুঃখিত তবে ডেটা সিরিয়ালাইজেশন ব্যতীত অন্য কোনও কিছুর জন্য পিগি-ব্যাক-ব্যাক ব্যতীত এটিকে সিরিয়ালায়িত করার শক্তি নেওয়া গুরুত্বপূর্ণ।

@implementation NSData (Hex)

- (NSString*)hexString
{
    NSUInteger length = self.length;
    unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (length*2));
    unsigned char* bytes = (unsigned char*)self.bytes;
    for (NSUInteger i = 0; i < length; i++) {
        unichar c = bytes[i] / 16;
        if (c < 10) {
            c += '0';
        } else {
            c += 'A' - 10;
        }
        hexChars[i*2] = c;

        c = bytes[i] % 16;
        if (c < 10) {
            c += '0';
        } else {
            c += 'A' - 10;
        }
        hexChars[i*2+1] = c;
    }
    NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars length:length*2 freeWhenDone:YES];
    return [retVal autorelease];
}

@end

তবে আপনাকে রিটার্নের আগে (হেক্সচারার) ফ্রি করতে হবে।
করিম

3
@ করিম, এটি ভুল। ইনিউইচ্যাকার্টারসনোকপি ব্যবহার করে: দৈর্ঘ্য: ফ্রিভেনডোন: এবং ফ্রিওহেনডোন হ্যাঁ হ'ল, এনএসএসস্ট্রিং সেই বাইট বাফারটির নিয়ন্ত্রণ নেবে। ফ্রি (হেক্সচারার) কল করার ফলে ক্রাশ হবে। এখানকার সুবিধাটি যথেষ্ট, যেহেতু এনএসএসআর্টিংকে ব্যয়বহুল মেমকিপি কল করতে হবে না।
এনএসপিগ্রামগ্রাম

@ এনএসপি প্রোগ্রামার ধন্যবাদ। আমি এনএসএসটিং ইনিশিয়ালাইজারটি লক্ষ্য করিনি।
করিম

ডকুমেন্টেশনটিতে বলা হয়েছে যে descriptionএকটি হেক্সস এনকোডড স্ট্রিং ফেরত দেয়, তাই এটি আমার কাছে যুক্তিসঙ্গত বলে মনে হয়।
আনকমমন

আমরা মলোক প্রত্যাবর্তিত মান সম্ভাব্য নালার জন্য পরীক্ষা করা উচিত নয়?
সিউর

9

রূপান্তরটি করার এখানে একটি দ্রুত উপায়:

বেঞ্চমার্ক (1024 বাইট ডেটা রূপান্তরের জন্য গড় সময় 100 বার পুনরাবৃত্তি হয়েছে):

ডেভ গ্যালাগার: ~ 8.070 এমএস
এনএসপিগ্রামগ্রাম: ~ 0.077 এমএস
পিটার: ~ 0.031 এমএস
এই এক: ~ 0.017 এমএস

@implementation NSData (BytesExtras)

static char _NSData_BytesConversionString_[512] = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";

-(NSString*)bytesString
{
    UInt16*  mapping = (UInt16*)_NSData_BytesConversionString_;
    register UInt16 len = self.length;
    char*    hexChars = (char*)malloc( sizeof(char) * (len*2) );

    // --- Coeur's contribution - a safe way to check the allocation
    if (hexChars == NULL) {
    // we directly raise an exception instead of using NSAssert to make sure assertion is not disabled as this is irrecoverable
        [NSException raise:@"NSInternalInconsistencyException" format:@"failed malloc" arguments:nil];
        return nil;
    }
    // ---

    register UInt16* dst = ((UInt16*)hexChars) + len-1;
    register unsigned char* src = (unsigned char*)self.bytes + len-1;

    while (len--) *dst-- = mapping[*src--];

    NSString* retVal = [[NSString alloc] initWithBytesNoCopy:hexChars length:self.length*2 encoding:NSASCIIStringEncoding freeWhenDone:YES];
#if (!__has_feature(objc_arc))
   return [retVal autorelease];
#else
    return retVal;
#endif
}

@end

1
আপনি দেখতে পারেন যে আমি এখানে কীভাবে ম্যালোক চেকটি প্রয়োগ করেছি ( _hexStringপদ্ধতি): github.com/ZipArchive/ZipArchive/blob/master/SSZipArchive/…
Cœur

রেফারেন্সের জন্য ধন্যবাদ - বিটিডাব্লু আমি 'খুব দীর্ঘ' পছন্দ করি - এটি সত্য, তবে এখন আমি এটি টাইপ করেছি, যে কেউ অনুলিপি / পেস্ট করতে পারে - আমি রসিকতা করছি - আমি এটি তৈরি করেছি - আপনি ইতিমধ্যে জানতেন :) আপনি ঠিক আছেন দীর্ঘ, আমি মাইক্রোসেকেন্ড জিততে পারে যেখানেই হিট করার চেষ্টা করছিলাম! এটি লুপ পুনরাবৃত্তিকে 2 দ্বারা ভাগ করে দেয় তবে আমি স্বীকার করি এটির মধ্যে কমনীয়তার অভাব রয়েছে। বাই
মুজ

8

কার্যকরী সুইফ্ট সংস্করণ

এক রৈখিক:

let hexString = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes),
count: data.length).map { String(format: "%02x", $0) }.joinWithSeparator("")

এখানে একটি পুনঃব্যবহারযোগ্য এবং স্ব ডকুমেন্টিং এক্সটেনশন ফর্মটিতে রয়েছে:

extension NSData {
    func base16EncodedString(uppercase uppercase: Bool = false) -> String {
        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes),
                                                count: self.length)
        let hexFormat = uppercase ? "X" : "x"
        let formatString = "%02\(hexFormat)"
        let bytesAsHexStrings = buffer.map {
            String(format: formatString, $0)
        }
        return bytesAsHexStrings.joinWithSeparator("")
    }
}

বিকল্পভাবে, ব্যবহার করুন reduce("", combine: +)joinWithSeparator("") আপনার সহকর্মীদের দ্বারা কার্যকরী মাস্টার হিসাবে দেখার পরিবর্তে করুন ।


সম্পাদনা করুন: আমি স্ট্রিংকে ($ 0, রেডিক্স: 16) স্ট্রিংয়ে পরিবর্তন করেছি (ফর্ম্যাট: "% 02x", to 0), কারণ প্যাডিং শূন্যের জন্য একটি অঙ্কের সংখ্যা দরকার


7

পিটারের উত্তরটি সুইফটে পোর্ট করে

func hexString(data:NSData)->String{
    if data.length > 0 {
        let  hexChars = Array("0123456789abcdef".utf8) as [UInt8];
        let buf = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes), count: data.length);
        var output = [UInt8](count: data.length*2 + 1, repeatedValue: 0);
        var ix:Int = 0;
        for b in buf {
            let hi  = Int((b & 0xf0) >> 4);
            let low = Int(b & 0x0f);
            output[ix++] = hexChars[ hi];
            output[ix++] = hexChars[low];
        }
        let result = String.fromCString(UnsafePointer(output))!;
        return result;
    }
    return "";
}

swift3

func hexString()->String{
    if count > 0 {
        let hexChars = Array("0123456789abcdef".utf8) as [UInt8];
        return withUnsafeBytes({ (bytes:UnsafePointer<UInt8>) -> String in
            let buf = UnsafeBufferPointer<UInt8>(start: bytes, count: self.count);
            var output = [UInt8](repeating: 0, count: self.count*2 + 1);
            var ix:Int = 0;
            for b in buf {
                let hi  = Int((b & 0xf0) >> 4);
                let low = Int(b & 0x0f);
                output[ix] = hexChars[ hi];
                ix += 1;
                output[ix] = hexChars[low];
                ix += 1;
            }
            return String(cString: UnsafePointer(output));
        })
    }
    return "";
}

সুইফট 5

func hexString()->String{
    if count > 0 {
        let hexChars = Array("0123456789abcdef".utf8) as [UInt8];
        return withUnsafeBytes{ bytes->String in
            var output = [UInt8](repeating: 0, count: bytes.count*2 + 1);
            var ix:Int = 0;
            for b in bytes {
                let hi  = Int((b & 0xf0) >> 4);
                let low = Int(b & 0x0f);
                output[ix] = hexChars[ hi];
                ix += 1;
                output[ix] = hexChars[low];
                ix += 1;
            }
            return String(cString: UnsafePointer(output));
        }
    }
    return "";
}

4

আমার এই সমস্যাটি সমাধান করা দরকার এবং উত্তরগুলি এখানে খুব দরকারী বলে খুঁজে পেয়েছি তবে আমি পারফরম্যান্স নিয়ে চিন্তিত। এই উত্তরগুলির বেশিরভাগটিতে এনএসডিটা থেকে প্রচুর পরিমাণে ডেটা অনুলিপি করা জড়িত তাই আমি কম ওভারহেড দিয়ে রূপান্তরটি করতে নিম্নলিখিতগুলি লিখেছিলাম:

@interface NSData (HexString)
@end

@implementation NSData (HexString)

- (NSString *)hexString {
    NSMutableString *string = [NSMutableString stringWithCapacity:self.length * 3];
    [self enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop){
        for (NSUInteger offset = 0; offset < byteRange.length; ++offset) {
            uint8_t byte = ((const uint8_t *)bytes)[offset];
            if (string.length == 0)
                [string appendFormat:@"%02X", byte];
            else
                [string appendFormat:@" %02X", byte];
        }
    }];
    return string;
}

এটি পুরো ফলাফলের জন্য স্ট্রিংটিতে প্রাক-বরাদ্দ করে এবং এনুমেডাটা সামগ্রীগুলি অনুলিপিবিটরেঞ্জস ইউজিংব্লক ব্যবহার করে অনুলিপি করা থেকে বিরত থাকে। বিন্যাসের স্ট্রিংয়ে এক্সকে x এ পরিবর্তন করা ছোট হাতের অক্ষর ব্যবহার করবে। আপনি যদি বাইটগুলির মধ্যে বিভাজক না চান তবে আপনি বিবৃতিটি হ্রাস করতে পারবেন

if (string.length == 0)
    [string appendFormat:@"%02X", byte];
else
    [string appendFormat:@" %02X", byte];

নিচে শুধু

[string appendFormat:@"%02X", byte];

2
আমি বিশ্বাস করি বাইট মানটি পুনরুদ্ধার করতে সূচকটির সমন্বয় প্রয়োজন, কারণ এটি NSRangeবৃহত্তর NSDataউপস্থাপনার মধ্যে সীমা নির্দেশ করে , ছোট বাইট বাফারের মধ্যে নয় (সরবরাহিত ব্লকের প্রথম প্যারামিটার enumerateByteRangesUsingBlock) যা বৃহত্তরের একক সামঞ্জস্যপূর্ণ অংশকে উপস্থাপন করে NSData। সুতরাং, byteRange.lengthবাইট বাফারটির আকার প্রতিবিম্বিত হয় byteRange.locationতবে বৃহত্তর মধ্যে অবস্থানটি NSData। সুতরাং, আপনি বাইটটি পুনরুদ্ধার করতে সহজভাবে offsetনয় byteRange.location + offset, ব্যবহার করতে চান ।
রব

1
@ রব ধন্যবাদ, আমি আপনাকে কী বলতে চাইছি এবং কোডটি সামঞ্জস্য করেছেন
জন স্টিফেন

1
আপনি বিবৃতি নিচে সংশোধন শুধু একক ব্যবহার করতে appendFormatআপনি সম্ভবত এছাড়াও পরিবর্তন করা উচিত self.length * 3কাছেself.length * 2
টি Colligan

1

আমার একটি উত্তর প্রয়োজন যা ভেরিয়েবল দৈর্ঘ্যের স্ট্রিংয়ের জন্য কাজ করবে, তাই আমি যা করেছি তা এখানে:

+ (NSString *)stringWithHexFromData:(NSData *)data
{
    NSString *result = [[data description] stringByReplacingOccurrencesOfString:@" " withString:@""];
    result = [result substringWithRange:NSMakeRange(1, [result length] - 2)];
    return result;
}

এনএসএসস্ট্রিং ক্লাসের এক্সটেনশন হিসাবে দুর্দান্ত কাজ করে।


1
অ্যাপল যদি তাদের বর্ণনা উপস্থাপনের পদ্ধতি পরিবর্তন করে তবে কী হবে?
ব্রেন্ডেন

1
আইওএস 13-এ বর্ণনা পদ্ধতিতে একটি ভিন্ন ফর্ম্যাট দেয়।
nacho4d

1

আপনি ডেটা বর্ননাতে অক্ষরগুলি মূলধন করতে সর্বদা [আপনার স্ট্রিং বড় বড় স্ট্রিং] ব্যবহার করতে পারেন


1

এনএসডিটারে এনএসডাটা সিরিয়ালাইজ / ডিজিজায়াল করার আরও ভাল উপায় হ'ল ম্যাক বেস 64 এনকোডার / ডিকোডারের জন্য গুগল টুলবক্স ব্যবহার করা use আপনার অ্যাপ্লিকেশন প্রকল্পটিতে কেবল প্যাকেজ ফাউন্ডেশন থেকে GTMBase64.m, GTMBase64.he GTMDefines.h ফাইলগুলি টেনে আনুন এবং এর মতো কিছু করুন

/**
 * Serialize NSData to Base64 encoded NSString
 */
-(void) serialize:(NSData*)data {

    self.encodedData = [GTMBase64 stringByEncodingData:data];

}

/**
 * Deserialize Base64 NSString to NSData
 */
-(NSData*) deserialize {

    return [GTMBase64 decodeString:self.encodedData];

}

এ খুঁজছি সোর্স কোড যে বর্গ যে প্রদানের এখন GTMStringEncoding হয় বলে মনে হয়। আমি এটি চেষ্টা করে দেখিনি তবে দেখতে এই প্রশ্নের একটি দুর্দান্ত নতুন সমাধান বলে মনে হচ্ছে।
সরফাতা

1
ম্যাক ওএস এক্স 10.6 / আইওএস 4.0 হিসাবে, এনএসডিটা বেস -৪৪ এনকোডিং করে। string = [data base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0]
jrc

@ জেআরসি যে সত্য, তবে বেস-64৪-তে বাস্তব কাজের স্ট্রিংগুলি এনকোড করার কথা বিবেচনা করুন। আপনাকে "ওয়েব সেফ" এনকোডিংয়ের সাথে মোকাবিলা করতে হবে, জিটিএমবেস 64 # ওয়েবসেফইনকোডাটাটা যেমন আইওএস / ম্যাকওএসে আপনার নেই। এছাড়াও আপনার বেস 64 "প্যাডিং" যুক্ত / মুছে ফেলার প্রয়োজন হতে পারে, সুতরাং আপনার এই বিকল্পটিও রয়েছে: জিটিএমবেস 64 # স্ট্রিংবাই ওয়েবেসেফ এনকোডিংডেটা: (এনএসডিটা *) ডেটা প্যাডড: (বিওএল) প্যাডড;
loretoparisi

1

সুইফট 3 ব্যবহার করে একটি সমাধান এখানে দেওয়া হল

extension Data {

    public var hexadecimalString : String {
        var str = ""
        enumerateBytes { buffer, index, stop in
            for byte in buffer {
                str.append(String(format:"%02x",byte))
            }
        }
        return str
    }

}

extension NSData {

    public var hexadecimalString : String {
        return (self as Data).hexadecimalString
    }

}

0
@implementation NSData (Extn)

- (NSString *)description
{
    NSMutableString *str = [[NSMutableString alloc] init];
    const char *bytes = self.bytes;
    for (int i = 0; i < [self length]; i++) {
        [str appendFormat:@"%02hhX ", bytes[i]];
    }
    return [str autorelease];
}

@end

Now you can call NSLog(@"hex value: %@", data)

0

পরিবর্তন %08xকরার জন্য %08Xরাজধানী অক্ষর জন্য।


6
আপনি কোনও প্রসঙ্গ অন্তর্ভুক্ত না করায় এটি মন্তব্য হিসাবে ভাল হবে। শুধু বলুন '
ব্রেন্ডেন

0

সুইফট + সম্পত্তি।

আমি সম্পত্তি হিসাবে হেক্স প্রতিনিধিত্ব করতে পছন্দ (যেমন bytesএবং descriptionসম্পত্তি হিসাবে একই ):

extension NSData {

    var hexString: String {

        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        return buffer.map { String(format: "%02x", $0) }.joinWithSeparator("")
    }

    var heXString: String {

        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        return buffer.map { String(format: "%02X", $0) }.joinWithSeparator("")
    }
}

আইডিয়া এই উত্তর থেকে ধার করা হয়


-4
[deviceToken description]

আপনার খালি জায়গা সরিয়ে ফেলতে হবে।

ব্যক্তিগতভাবে আমি base64এনকোড করেছি deviceToken, তবে এটি স্বাদের বিষয়।


এটি একই ফলাফল পায় না। বিবরণটি ফিরে আসে: <2cf56d5d 2fab0a47 ... 7738ce77 7e791759> আমি যখন খুঁজছি: 2CF56D5D2FAB0A47 .... 7738CE777E791759
সরফটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.