IOS 長(zhǎng)鏈接與短鏈接之間的轉(zhuǎn)換
IOS 長(zhǎng)鏈接與短鏈接之間的轉(zhuǎn)換
首先需要將字符串使用md5加密,添加NSString的md5的類(lèi)別方法如下
.h文件
#import <CommonCrypto/CommonDigest.h> @interface NSString (md5) -(NSString *) md5HexDigest; @end
.m文件
#import "NSString+md5.h"
@implementation NSString (md5)
- (NSString *) md5HexDigest
{
const char *original_str = [self UTF8String];
unsignedchar result[CC_MD5_DIGEST_LENGTH];
CC_MD5(original_str, strlen(original_str), result);
NSMutableString *hash = [NSMutableStringstring];
for (int i = 0; i < 16; i++)
[hash appendFormat:@"%02X", result[i]];
NSLog(@"lowercaseString = %@",[hash lowercaseString]);
return [hash lowercaseString];
}
@end
然后就是轉(zhuǎn)換算法了,其實(shí)與java版本的相同,只是用OC來(lái)實(shí)現(xiàn)
- (NSString *)shortUrl:(NSString *)url
{
NSArray *chars = [[NSArray alloc] initWithObjects:@"a" , @"b" , @"c" , @"d" , @"e" , @"f" , @"g" , @"h" ,
@"i" , @"j" , @"k" , @"l" , @"m" , @"n" , @"o" , @"p" , @"q" , @"r" , @"s" , @"t" ,
@"u" , @"v" , @"w" , @"x" , @"y" , @"z" , @"0" , @"1" , @"2" , @"3" , @"4" , @"5" ,
@"6" , @"7" , @"8" , @"9" , @"A" , @"B" , @"C" , @"D" , @"E" , @"F" , @"G" , @"H" ,
@"I" , @"J" , @"K" , @"L" , @"M" , @"N" , @"O" , @"P" , @"Q" , @"R" , @"S" , @"T" ,
@"U" , @"V" , @"W" , @"X" , @"Y" , @"Z", nil];
NSLog(@"chars = %d", [chars count]);
NSString *key = @"xxxxxx";
NSString *hex = [NSStringstringWithFormat:@"%@",[[key stringByAppendingFormat:@"%@",url] md5HexDigest]];
NSLog(@"hex = %@", hex);
NSMutableArray *resUrl = [[NSMutableArrayalloc] initWithCapacity:4];
for (int i=0; i<4; i++) {
// 把加密字符按照 8 位一組 16 進(jìn)制與 0x3FFFFFFF 進(jìn)行位與運(yùn)算
NSString *sTempSubString = [hex substringWithRange:NSMakeRange(i*8, 8)];
// 這里需要使用 long 型來(lái)轉(zhuǎn)換,因?yàn)?Inteper只能處理 31 位 , 首位為符號(hào)位 , 如果不用 long ,則會(huì)越界
long longOfTemp;
sscanf([sTempSubString cStringUsingEncoding:NSASCIIStringEncoding], "%lx", &longOfTemp);
long lHexLong = 0x3FFFFFFF & longOfTemp;
NSString *outChars = @"";
for (int j=0; j<6; j++) {
// 把得到的值與 0x0000003D 進(jìn)行位與運(yùn)算,取得字符數(shù)組 chars 索引
long index = 0x0000003D & lHexLong;
// 把取得的字符相加
outChars = [outChars stringByAppendingFormat:@"%@",[chars objectAtIndex:(int)index]];
// 每次循環(huán)按位右移 5 位
lHexLong = lHexLong >> 5;
}
// 把字符串存入對(duì)應(yīng)索引的輸出數(shù)組
[resUrl insertObject:outChars atIndex:i];
}
return [resUrl objectAtIndex:0];//這里可以返回任意一個(gè)元素作為短鏈接(0,1,2,3)
}
提 示:長(zhǎng)鏈接轉(zhuǎn)換短鏈接,原理很簡(jiǎn)單,就相當(dāng)于重命名,只是自己的服務(wù)器定義自己的規(guī)則,有自己的密鑰(也就是算法中定義的key變量,需要替換成自己用品 定義的key),然后確定使用resUrl中的哪個(gè)index的元素為可以識(shí)別的短鏈接,如果確定為第0個(gè),那么算法中就要返回第0個(gè)。要拿來(lái)自己用的 話,只需要改一下key值即可。
必須有服務(wù)器定義key,要不點(diǎn)擊轉(zhuǎn)換成功后的鏈接瀏覽器是無(wú)法識(shí)別的,還有就是這里返回的字符串僅僅是一 串字符,并不帶有域名什么的,還需要自己確定一套域名規(guī)則,比如新浪的地址轉(zhuǎn)換成功后都是以http://t.cn/打頭的,那么你就需要定義一個(gè)類(lèi)似的 域名,域名具體如何定義這就不細(xì)說(shuō)了!
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
IOS中自定義類(lèi)中限制使用原生實(shí)例化方法
這篇文章主要介紹了IOS中自定義類(lèi)中限制使用原生實(shí)例化方法的相關(guān)資料,需要的朋友可以參考下2017-09-09
iOS、Mac OS X系統(tǒng)中編程實(shí)現(xiàn)漢字轉(zhuǎn)拼音的方法(超級(jí)簡(jiǎn)單)
這篇文章主要介紹了iOS、Mac OS X系統(tǒng)中編程實(shí)現(xiàn)漢字轉(zhuǎn)拼音的方法(超級(jí)簡(jiǎn)單),本文講解的方法不僅支持中文,還支持日文、韓文等,需要的朋友可以參考下2015-04-04
iOS動(dòng)畫(huà)解析之支付寶支付打鉤動(dòng)畫(huà)的實(shí)現(xiàn)方法
支付寶支付打鉤動(dòng)畫(huà)相信對(duì)大家來(lái)說(shuō)都不陌生,這篇文章主要給大家介紹了關(guān)于iOS動(dòng)畫(huà)解析之支付寶支付動(dòng)畫(huà)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
IOS實(shí)現(xiàn)的簡(jiǎn)單畫(huà)板功能
本文主要介紹了IOS實(shí)現(xiàn)簡(jiǎn)單畫(huà)板的示例代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
使用objc runtime實(shí)現(xiàn)iOS閉環(huán)的懶加載功能
利用objc runtime的動(dòng)態(tài)性實(shí)現(xiàn)懶加載可以實(shí)現(xiàn)即可增加又可刪除功能,也可以避免污染類(lèi)型。這篇文章主要介紹了使用objc runtime實(shí)現(xiàn)iOS閉環(huán)的懶加載功能,需要的朋友可以參考下2019-06-06
iOS App使用SQLite之句柄的定義及數(shù)據(jù)庫(kù)的基本操作
SQLite中在定義過(guò)句柄之后就可以指向數(shù)據(jù)庫(kù),從而利用iOS應(yīng)用程序進(jìn)行打開(kāi)或關(guān)閉等各種操作,這里我們就來(lái)看一下iOS App使用SQLite之句柄的定義及數(shù)據(jù)庫(kù)的基本操作2016-06-06
iOS開(kāi)發(fā)之運(yùn)動(dòng)事件和遠(yuǎn)程控制
在iOS中事件分為三類(lèi):觸摸事件:通過(guò)觸摸、手勢(shì)進(jìn)行觸發(fā)(例如手指點(diǎn)擊、縮放),運(yùn)動(dòng)事件:通過(guò)加速器進(jìn)行觸發(fā)(例如手機(jī)晃動(dòng)),遠(yuǎn)程控制事件:通過(guò)其他遠(yuǎn)程設(shè)備觸發(fā)(例如耳機(jī)控制按鈕)今天我們來(lái)詳細(xì)探討下運(yùn)動(dòng)事件和遠(yuǎn)程控制2016-04-04
IOS購(gòu)物車(chē)界面實(shí)現(xiàn)效果示例
本篇文章主要介紹了IOS購(gòu)物車(chē)界面實(shí)現(xiàn)效果示例,有需要了解的朋友可參考。希望此文章對(duì)各位有所幫助。2017-02-02

