iOS 關(guān)于大小端以及一些數(shù)據(jù)補(bǔ)位

關(guān)于大小端

所謂大端數(shù)據(jù)就是數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中蝴簇,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中春感,這樣的存儲模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加恩尾,而數(shù)據(jù)從高位往低位放壶熏;這和我們的閱讀習(xí)慣一致但壮。

所謂的小端數(shù)據(jù)就是數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中陶夜,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中凛驮,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高条辟,低地址部分權(quán)值低黔夭。(簡單的來說就是反過來存放數(shù)據(jù)了)

關(guān)于補(bǔ)位

數(shù)據(jù)補(bǔ)位,是指在將數(shù)據(jù)按照8個(gè)字節(jié)一段進(jìn)行加密或解密得到一段8個(gè)字節(jié)的密文或者明文羽嫡,最后一段不足8個(gè)字節(jié)本姥,按照需求補(bǔ)足8個(gè)字節(jié)(通常補(bǔ)00或者FF,根據(jù)實(shí)際要求不同)進(jìn)行計(jì)算杭棵,之后按照順序?qū)⒂?jì)算所得的數(shù)據(jù)連在一起即可婚惫。

舉個(gè)栗子??!

假設(shè)要發(fā)送一段這樣的數(shù)據(jù)(16進(jìn)制數(shù)據(jù)):

| head | cmdlen(2字節(jié)) | cmd | playloadLen (4 字節(jié)) | playload

這段數(shù)據(jù)的內(nèi)容大概是包含了:我有一個(gè)頭部標(biāo)記魂爪,然后用頭部之后的兩個(gè)字節(jié)作為描述何種命令的長度先舷,然后接上的是何種命令,然后接上了附帶信息的長度(4個(gè)字節(jié))滓侍,然后是附帶信息蒋川。

需要發(fā)送的信息為:**| https(頭部) | len | openStream | len2 | {@"速度與激情.h264",@"fileName"} **

//
//  CtpTools.m
//  NetworkTest
//
//  Created by 飛天江郎 on 10/11/2016.
//  Copyright ? 2016 EzioChen. All rights reserved.
//

//普通字符串轉(zhuǎn)換為十六進(jìn)制的。

+ (NSString *)hexStringFromString:(NSString *)string{
    NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
    Byte *bytes = (Byte *)[myD bytes];
    //下面是Byte 轉(zhuǎn)換為16進(jìn)制撩笆。
    NSString *hexStr=@"";
    for(int i=0;i<[myD length];i++)
        
    {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16進(jìn)制數(shù)
        
        if([newHexStr length]==1)
            
            hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
        
        else
            
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
    }   
    return hexStr;   
}

//編寫一個(gè)NSData類型數(shù)據(jù)
+(NSMutableData*)HexStringToData:(NSString*)str{
    
    NSString *command = str;
    command = [command stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSMutableData *commandToSend= [[NSMutableData alloc] init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [command length]/2; i++) {
        byte_chars[0] = [command characterAtIndex:i*2];
        byte_chars[1] = [command characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [commandToSend appendBytes:&whole_byte length:1];
    }
    return commandToSend;
}

//補(bǔ)位的方法
+(NSString*)addString:(NSString*)string Length:(NSInteger)length OnString:(NSString*)str{
    
    NSMutableString * nullStr = [[NSMutableString alloc] initWithString:@""];
    if ((length-str.length)> 0) {
        for (int i = 0; i< (length-str.length); i++) {
            [nullStr appendString:string];
        }
    }
    return [NSString stringWithFormat:@"%@%@",nullStr,str];
}

//把整型轉(zhuǎn)化為16進(jìn)制的捺球,然后在補(bǔ)位,轉(zhuǎn)換成大端數(shù)據(jù)
+(NSString *)intToHexString:(NSInteger)number length:(NSInteger)len{

    NSString *result = [self addString:@"0" Length:len OnString:[self ToHex:(unsigned int)number]];
    NSData *data = [self HexStringToData:result];
    NSData *lastData = [self dataTransfromBigOrSmall:data];
    
    result = [self dataChangeToString:lastData];
    
    return result;
    
}

//把int 變成 16進(jìn)制的字符串
+(NSString *)ToHex:(unsigned int)number
{
    NSString * result = [NSString stringWithFormat:@"%x",number];
    if (result.length<2) {
        result = [NSString stringWithFormat:@"0%x",number];
    }
    return [result uppercaseString];
}

//把data(十六進(jìn)制)轉(zhuǎn)化為為十進(jìn)制整型
+(NSInteger)dataToInt:(NSData *)data{

    
    NSInteger temp;
    double sum = 0.0;
    NSString * string = [self dataChangeToString:data];
    NSInteger length = string.length;
    
    
    for (int i = 0 ; i < length; i++) {
        NSString * tempStr = [string substringWithRange:NSMakeRange(i, 1)];
        int tempInt = [self StringToInt:tempStr];
        double tempDouble = tempInt * pow(16.0, (double)(length-1-i));
        sum = sum + tempDouble;
    }
    
    temp = (NSInteger)sum;
    return temp;

}

//大小端數(shù)據(jù)轉(zhuǎn)換(其實(shí)還有更簡便的方法夕冲,不過看起來這個(gè)方法是最直觀的)
+(NSData *)dataTransfromBigOrSmall:(NSData *)data{

    NSString *tmpStr = [self dataChangeToString:data];
    NSMutableArray *tmpArra = [NSMutableArray array];
    for (int i = 0 ;i<data.length*2 ;i+=2) {
        NSString *str = [tmpStr substringWithRange:NSMakeRange(i, 2)];
        [tmpArra addObject:str];
    }
    
    NSArray *lastArray = [[tmpArra reverseObjectEnumerator] allObjects];

    NSMutableString *lastStr = [NSMutableString string];
    
    for (NSString *str in lastArray) {
        
        [lastStr appendString:str];
        
    }
    
    NSData *lastData = [self HexStringToData:lastStr];
    
    return lastData;
    
}

+(NSString*)dataChangeToString:(NSData*)data{
    
    NSString * string = [NSString stringWithFormat:@"%@",data];
    string = [string stringByReplacingOccurrencesOfString:@"<" withString:@""];
    string = [string stringByReplacingOccurrencesOfString:@">" withString:@""];
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    return string;
    
}

+(int)StringToInt:(NSString*)string{
    
    int temp;
    
    temp = [string intValue];
    
    if ([string isEqual:@"a"]||[string isEqual:@"A"]) {
        temp = 10;
    }else if ([string isEqual:@"b"]||[string isEqual:@"B"])
    {
        temp = 11;
    }else if ([string isEqual:@"c"]||[string isEqual:@"C"])
    {
        temp = 12;
    }else if ([string isEqual:@"d"]||[string isEqual:@"D"])
    {
        temp = 13;
    }else if ([string isEqual:@"e"]||[string isEqual:@"E"])
    {
        temp = 14;
    }else if ([string isEqual:@"f"]||[string isEqual:@"F"])
    {
        temp = 15;
    }
    return temp;
}

//hexString 轉(zhuǎn)換成 String
+ (NSString *)stringFromHexString:(NSString *)hexString {
    
    char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
    bzero(myBuffer, [hexString length] / 2 + 1);
    for (int i = 0; i < [hexString length] - 1; i += 2) {
        unsigned int anInt;
        NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
        NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];
        [scanner scanHexInt:&anInt];
        myBuffer[i / 2] = (char)anInt;
    }
    NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4];

    return unicodeString; 
    
}

調(diào)用方法

    NSString *headStr = @"https";
    NSString *playload = @"{\"fileName\":\"速度與激情.h264\"}";
    NSString *cmd = @"openStream";
    
    NSString *headHex = [self hexStringFromString:headStr];
    
    NSString *cmdHex = [self hexStringFromString:cmd];

    NSString *cmdLen = [self intToHexString:cmdHex.length/2 length:4];

    NSString *playloadHex = [self hexStringFromString:playload];
    
    NSString *playloadHexLen = [self intToHexString:playloadHex.length/2 length:8];

    NSString *allHexStr = [self stringWithFormat:@"%@%@%@%@%@",headHex,cmdLen,cmdHex,playloadHexLen,playloadHex];

     NSData *lastData = [self HexStringToData:allHexStr];
     NSLog(@"lastData=>%@",lastData);


最后打印出的Data氮兵,就是對應(yīng)數(shù)據(jù)的16進(jìn)制標(biāo)準(zhǔn)格式了。

其實(shí)還有一些可優(yōu)化的地方耘擂,仔細(xì)的觀察下每次的Data組裝胆剧,然后你就會發(fā)現(xiàn)NSData本來就已經(jīng)是16進(jìn)制的絮姆,而大小端的轉(zhuǎn)換其實(shí)還有跟簡單的轉(zhuǎn)換比方說是這種:

#include <sys/cdefs.h>

#define ntohs(x) __DARWIN_OSSwapInt16(x)
#define htons(x) __DARWIN_OSSwapInt16(x)

#define ntohl(x) __DARWIN_OSSwapInt32(x)
#define htonl(x) __DARWIN_OSSwapInt32(x)

這里寫成這樣完全是方便理解醉冤、

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秩霍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚁阳,更是在濱河造成了極大的恐慌铃绒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螺捐,死亡現(xiàn)場離奇詭異颠悬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)定血,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門赔癌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澜沟,你說我怎么就攤上這事灾票。” “怎么了茫虽?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵刊苍,是天一觀的道長。 經(jīng)常有香客問我濒析,道長正什,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任号杏,我火速辦了婚禮婴氮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盾致。我一直安慰自己莹妒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布绰上。 她就那樣靜靜地躺著旨怠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜈块。 梳的紋絲不亂的頭發(fā)上鉴腻,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音百揭,去河邊找鬼爽哎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛器一,可吹牛的內(nèi)容都是我干的课锌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渺贤!你這毒婦竟也來了雏胃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤志鞍,失蹤者是張志新(化名)和其女友劉穎瞭亮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體固棚,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了此洲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂汗。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呜师,靈堂內(nèi)的尸體忽然破棺而出面徽,到底是詐尸還是另有隱情,我是刑警寧澤匣掸,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布趟紊,位于F島的核電站,受9級特大地震影響碰酝,放射性物質(zhì)發(fā)生泄漏霎匈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一送爸、第九天 我趴在偏房一處隱蔽的房頂上張望铛嘱。 院中可真熱鬧,春花似錦袭厂、人聲如沸墨吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帖烘。三九已至,卻和暖如春橄杨,著一層夾襖步出監(jiān)牢的瞬間秘症,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工式矫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乡摹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓采转,卻偏偏與公主長得像聪廉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評論 6 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記情萤,在此感謝他和像他一樣...
    Gibbs基閱讀 37,117評論 8 114
  • 語文: 1.語文練習(xí)冊上兩行ai沒寫完的鸭蛙,請補(bǔ)齊! 2.拼音本:ai寫一行(共7個(gè)筋岛,前三個(gè)不加聲調(diào)娶视,后四個(gè)加聲調(diào))...
    瑞睿家閱讀 411評論 0 0
  • 走進(jìn)你的房間是最熱的(鋼琴聲響起) 聽著你放的歌是最無聊的 拜托,能不能歡快點(diǎn) 房間的手機(jī)不斷震動 你的來電總是靜...
    馭臨風(fēng)閱讀 179評論 0 1