iOS-TCP/IP協(xié)議傳輸數(shù)據(jù)常用的類型轉(zhuǎn)換(歡迎補充~)

之前一直在做關于TCP/IP的項目,關于數(shù)據(jù)處理是最麻煩的,每次遇到新的數(shù)據(jù)類型就多一個新類的方法,導致很混亂,今天決定整理下,形成一個分類.

寫得不太好,有這方面經(jīng)驗的朋友可以在評論處留言,希望大家了一起完善~~~

NSData+Category.h

#import <Foundation/Foundation.h>

@interface NSData (Category)

// 注意:在NSData里面,<01>表示1個字節(jié),用2個十六進制表示,1個十六進制表示4個bits

#pragma mark - valueMehthod

/// 返回包含8個字節(jié)Data邓萨,如:輸入1 -> <00 00 00 00 00 00 00 01>
+ (instancetype)dataFromLong:(long)value ;
/// 返回包含4個字節(jié)Data暑竟,如:輸入1 -> <00 00 00 01>
+ (instancetype)dataFromInt:(int)value ;
/// 返回包含2個字節(jié)Data焕盟,如:輸入1 -> <00 01>
+ (instancetype)dataFromShort:(short)value ;
/// 返回包含1個字節(jié)Data咆贬,如:輸入1 -> <01> value必須小于256
+ (instancetype)dataOneByteFromShort:(short)value ;

/// 返回long (必須滿足:self.length >= 8)
- (long)longValue ;
/// 返回int (必須滿足:self.length >= 4)
- (int)intValue ;
/// 返回short (必須滿足:self.length >= 2)
- (short)shortValue ;
/// 返回short (必須滿足:self.length >= 1)
- (short)shortValueFromOneByteData ;


#pragma mark - StringMethod

/// 返回Data <01ff> -> "01ff" 如果傳入?yún)?shù) str 為 1ff, 則hexdata打印出:hexdata: <01ff>
+ (instancetype)hexDataFromHexString:(NSString *)hexString ;
/// 十六進制字符串 <01ff> -> "01ff"
+ (NSString *)hexStringFromHexData:(NSData *)hexData ;

/// 返回網(wǎng)絡字節(jié)序的Data IPString -> data
+ (instancetype)ipDataFromIpString:(NSString *)ipString ;
/// ip字符串
+ (NSString *)ipStringFromIpData:(NSData *)ipData ;

/// 小端大端反轉(zhuǎn) (原本是小端,則變成大端;反之亦然)
- (NSData *)reverseBitAndLittleEnd ;

@end

NSData+Category.m

#import "NSData+Category.h"
#import <arpa/inet.h>

@implementation NSData (Category)

#pragma mark -- valueMethod

+ (instancetype)dataFromLong:(long)value {
    return [NSMutableData dataWithBytes: &value length: sizeof(long)];
}

+ (instancetype)dataFromInt:(int)value {
    return [NSMutableData dataWithBytes: &value length: sizeof(int)];
}

+ (instancetype)dataFromShort:(short)value {
    return [NSMutableData dataWithBytes: &value length: sizeof(short)];
}

+ (instancetype)dataOneByteFromShort:(short)value {
    NSAssert(value <= 256-1, @"value must be not overflow one byte value");
    return [NSMutableData dataWithBytes: &value length: sizeof(short)-1];
}

- (long)longValue {
    NSAssert(self.length >= 8, @"data length must be bigger than 8");
    long value;
    [self getBytes: &value length: sizeof(long)];
    return value;
}

- (int)intValue {
    NSAssert(self.length >= 4, @"data length must be bigger than 4");
    int value;
    [self getBytes: &value length: sizeof(int)];
    return value;
}

- (short)shortValue {
    NSAssert(self.length >= 2, @"data length must be bigger than 2");
    short value;
    [self getBytes: &value length: sizeof(short)];
    return value;
}

- (short)shortValueFromOneByteData {
    NSAssert(self.length >= 1, @"data length must be bigger than 1");
    short value;
    [self getBytes: &value length: 1];
    return value;
}

#pragma Mark - stringMethod
/// 返回Data <01ff> -> "01ff" 如果傳入?yún)?shù) str 為 1ff, 則hexdata打印出:hexdata: <01ff>
+ (instancetype)hexDataFromHexString:(NSString *)hexString {
    if (!hexString || [hexString length] == 0)  return nil;
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    NSRange range;
    if ([hexString length] % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        range = NSMakeRange(0, 1);
    }
    for (NSInteger i = range.location; i < [hexString length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [hexString substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    return hexData;
}

/// 十六進制字符串 <01ff> -> "01ff"
+ (NSString *)hexStringFromHexData:(NSData *)hexData {
    if (!hexData || [hexData length] == 0) return @"";
    
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[hexData length]];
    
    [hexData enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    
    return string;
}

/// 返回網(wǎng)絡字節(jié)序的Data IPString -> data
+ (instancetype)ipDataFromIpString:(NSString *)ipString {
    unsigned int s_addr = inet_addr([ipString UTF8String]);
    NSData *data = [NSMutableData dataWithBytes: &s_addr length: sizeof(unsigned int)];
    return data.reverseBitAndLittleEnd;
}

/// ip字符串
+ (NSString *)ipStringFromIpData:(NSData *)ipData {
    /// to unsigned int
    unsigned int value = *(unsigned int *)ipData.reverseBitAndLittleEnd.bytes;
    
    /// to char
    struct in_addr addr;
    addr.s_addr = value;
    char *strAddr = inet_ntoa(addr);
    
    return [NSString stringWithUTF8String:strAddr];
}

/// 小端大端反轉(zhuǎn) (原本是小端,則變成大端;反之亦然)
- (NSData *)reverseBitAndLittleEnd {
    NSMutableData *littleEndData = [NSMutableData data];
    
    for(int i = 0; i < self.length; i++){
        NSData *subdata = [self subdataWithRange:NSMakeRange(self.length -i -1, 1)];
        [littleEndData appendData:subdata];
    }
    return littleEndData;
}
@end
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羞酗,隨后出現(xiàn)的幾起案子樟结,更是在濱河造成了極大的恐慌政冻,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯病,死亡現(xiàn)場離奇詭異造烁,居然都是意外死亡,警方通過查閱死者的電腦和手機狱从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門膨蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人季研,你說我怎么就攤上這事敞葛。” “怎么了与涡?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵惹谐,是天一觀的道長。 經(jīng)常有香客問我驼卖,道長氨肌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任酌畜,我火速辦了婚禮怎囚,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己恳守,他們只是感情好考婴,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催烘,像睡著了一般沥阱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伊群,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天考杉,我揣著相機與錄音,去河邊找鬼舰始。 笑死崇棠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的丸卷。 我是一名探鬼主播易茬,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼及老!你這毒婦竟也來了抽莱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骄恶,失蹤者是張志新(化名)和其女友劉穎食铐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僧鲁,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡虐呻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寞秃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖春寿,靈堂內(nèi)的尸體忽然破棺而出朗涩,到底是詐尸還是另有隱情,我是刑警寧澤绑改,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布谢床,位于F島的核電站,受9級特大地震影響厘线,放射性物質(zhì)發(fā)生泄漏识腿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一造壮、第九天 我趴在偏房一處隱蔽的房頂上張望渡讼。 院中可真熱鬧,春花似錦、人聲如沸成箫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伟众。三九已至,卻和暖如春召廷,著一層夾襖步出監(jiān)牢的瞬間凳厢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工竞慢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留先紫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓筹煮,卻偏偏與公主長得像遮精,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子败潦,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355