ascii码转换 swift

2018-12-09 14:10:00 weixin_30701575 阅读数 85

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10091038.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
请注意,ASCII是American Standard Code for Information Interchange缩写,而不是ASCⅡ(罗马数字2),有很多人在这个地方产生误解。
在Swift中实现:字符串根据索引获取指定字符,
依据ASCII编码,实现字符和整数的相互转换。
首先扩展相应类的方法:
 1 //String扩展
 2 extension String {        
 3     //subscript函数可以检索数组中的值
 4     //直接按照索引方式截取指定索引的字符
 5     subscript (_ i: Int) -> Character {
 6         //读取字符
 7         get {return self[index(startIndex, offsetBy: i)]}
 8         
 9         //修改字符
10         set
11         {
12             //转换为字符数组
13             var arr:[Character] = Array(self)
14             arr[i] = newValue
15             self = String(arr)
16         }
17     }
18     
19     //String转ASCII整数值(定义小写为整数值)
20     public var ascii: Int {
21         return Int(unicodeScalars.first?.value ?? 0)
22     }
23 }
24 
25 //Character扩展 
26 extension Character  
27 {  
28   //Character转ASCII整数值(定义小写为整数值)
29    var ascii: Int {
30        get {
31            return Int(self.unicodeScalars.first?.value ?? 0)
32        }       
33     }
34 
35     //判断是否为数字
36     func isDigit() -> Bool
37     {
38         if self.ascii > 47 && self.ascii < 58
39         {
40             return true            
41         }
42         return false
43     }
44     
45     //判断是否为大写字母
46     func isUppercased() -> Bool
47     {
48         if self.ascii > 64 && self.ascii < 91
49         {
50             return true            
51         }
52         return false
53     }
54     
55     //判断是否为小写字母
56     func isLowercased() -> Bool
57     {
58         if self.ascii > 96 && self.ascii < 123
59         {
60             return true            
61         }
62         return false
63     }
64     
65     //判断是否为字母
66     func isLetter()-> Bool
67     {
68         if (self.ascii > 64 && self.ascii < 91) || (self.ascii > 96 && self.ascii < 123)
69         {
70             return true            
71         }
72         return false
73     }
74 }
75 
76 //Int扩展
77 extension Int
78 {
79     //Int转Character,ASCII值(定义大写为字符值)
80     var ASCII:Character 
81     {
82         get {return Character(UnicodeScalar(self)!)}
83     }
84 }

调用扩展方法,实现功能。示例:

 1 //字符串
 2 var str:String = "S"
 3 //String转ASCII整数值(定义小写为整数值)
 4 print(str.ascii)
 5 //Print:83
 6 
 7 //字符串
 8 str = "Strengthen"
 9 //根据索引获取字符
10 let char:Character = str[0]
11 //字符串修改
12 str[1] = Character("Q")
13 print(str)
14 //Print: SQrengthen
15 
16 //Character转ASCII整数值(定义小写为整数值)
17 let num:Int = char.ascii
18 print("\(char) ", terminator: "")
19 print("\(num) ", terminator: "")
20 //Print: S 83  
21      
22 //表示整数的字符串
23 let strNum:String = "88"
24 //先转换为整数,在根据ASCII表转换为对应字符
25 let charNum:Character = Int(strNum)!.ASCII
26 print("\(charNum) ", terminator: "")
27 //Print: X

 

转载于:https://www.cnblogs.com/strengthen/p/10091038.html

2016-10-29 13:56:00 weixin_33889245 阅读数 84

我们在C++里处理字符通常是这样的

char a = 'A' // A = 65
printf("'%c' = %d", a + 1, a + 1) // 'B' = 66

这在号称吸收C/C++所有优势特性的Swift里面是行不通的,因为
Character 和 Int 不能进行计算操作,会报错

var c:Character = "A"
c + 1 // 这里是错误的

Xcode 会告诉你 Binary operator '+' cannot be applied to operands of type 'Character' and 'Int'

于是乎教科书里没有说的内容就带来了问题

网上也没有

但是教科书里说到一个例子中有String.unicodeScalars可以返回字符串的ASCII(或者是Unicode值)的数组。

于是

UnicodeScalar

这个类就被找到了

字符”A”可以这么表示

let A = Character(UnicodeScalar(65))

它的值65可以这么来

let A_ASCII = UnicodeScalar("A") // 65
2019-07-08 11:38:30 qq_32117417 阅读数 1045

在xcode中,文件以utf8格式保存。因此,其中变量对象也是以utf8格式保存。不同语言的utf8编码不一样,不同语言的每个字符的utf8编码的字节数不一样,字节码也不一样。

但是英文的utf8编码和ascii码一样,对于英文字符,查看它的ascii码,将字符取出来,就是它的ascii码。

使用英文转换测试,如下所示:

// NSString to ASCII

NSString *string = @"A";

int asciiCode = [string characterAtIndex:0]; // 65



// ASCII to NSString

int asciiCode = 65;

NSString *string = [NSString stringWithFormat:@"%c", asciiCode]; // A

下面两组算法适用于蓝牙,wifi的协议发送

字符串转成ascii字符串:

//字符串转成ascii字符串
+(NSString *)stringToAsci:(NSString *)string {
    NSMutableString *mustring = [[NSMutableString alloc]init];
    const char *ch = [string cStringUsingEncoding:NSASCIIStringEncoding];
    for (int i = 0; i < strlen(ch); i++) {
        [mustring appendString:[NSString stringWithFormat:@"%x",ch[i]]];
    }
    return mustring;
}

字符串转data:


//字符串转成data

+(NSData*)hexToBytes:(NSString *)dataStr {
    NSMutableData* data = [NSMutableData data];
    int idx;
    for (idx = 0; idx+2 <= dataStr.length; idx+=2) {
        NSRange range = NSMakeRange(idx, 2);
        NSString* hexStr = [dataStr substringWithRange:range];
        NSScanner* scanner = [NSScanner scannerWithString:hexStr];
        unsigned int intValue;
        [scanner scanHexInt:&intValue];
        [data appendBytes:&intValue length:1];
        
    }
    return data;
}

NSData转NSString

 NSString *ssid = [[NSString alloc] initWithData:ssidData encoding:NSUTF8StringEncoding];

以下符合NSData转设备Mac地址业务:

//data转String
- (NSString *)convertDataToHexStr:(NSData *)data {
    UInt8 bytes[data.length];
    [data getBytes:&bytes range:NSMakeRange(0, data.length)];
    NSMutableString *hexStr = [NSMutableString string];
    for (int i = 0; i < data.length; i++) {
        [hexStr appendFormat:@"%02x",bytes[i]];
    }
    return hexStr;
}

 

2017-10-13 19:12:35 qq_39802178 阅读数 4324


(1)将字符转为整数值

var a:Character = "A"

var str = String(a)

var number:UInt32 = 0

for code in str.unicodeScalars {

    number = code.value;

}

print(number)


(2)将整数转换为字符

var num = 97

var ch:Character = Character(UnicodeScalar(num)!)

print(ch)

2013-09-12 16:18:09 mikixiyou 阅读数 13582
在xcode中,文件以utf8格式保存。因此,其中变量对象也是以utf8格式保存。不同语言的utf8编码不一样,英文的utf8编码和ascii码一样。
不同语言的每个字符的utf8编码的字节数不一样,字节码也不一样。对于英文字符,查看它的ascii码,很方便,将字符取出来,就是它的ascii码。其实,对于非英文字符,取字符集编码的方式也是这样。这样统称为取ASCII码,在很多文档中也是这样描述的。
网上很多这样例子,介绍如何将字符和ASCII码相互转化。但是它们都没有提及如何转换中文等其他非英文的字符,使用这个方法都会转成乱码。

使用英文转换测试,如下所示:
// NSString to ASCII
NSString *string = @"A";
int asciiCode = [string characterAtIndex:0]; // 65

// ASCII to NSString
int asciiCode = 65;
NSString *string = [NSString stringWithFormat:@"%c", asciiCode]; // A

再使用中文测试一下,使用[NSString stringWithFormat:@"%c", asciiCode]得到的是乱码字符,就是说根本没识别正确。
再说解决方法之前,先了解一下stringWithFormat方法中各种format。其中将ascii码转成字符有两种format,分别为%c和%C。

    /*
     %c
     8-bit unsigned character (unsigned char), printed by NSLog() as an ASCII character, or, if not an ASCII character, in the octal format \\ddd or the Unicode hexadecimal format \\udddd, where d is a digit.
     %C
     16-bit Unicode character (unichar), printed by NSLog() as an ASCII character, or, if not an ASCII character, in the octal format \\ddd or the Unicode hexadecimal format \\udddd, where d is a digit.
     */
使用[NSString stringWithFormat:@"%C", asciiCode]就可以正常得到所要的字符。
分别以英文,中文和日文举例。

    NSString *theString = @"g";
    unichar theChar = [theString characterAtIndex:0];
    NSString *theString1 = [NSString stringWithFormat:@"%c", theChar];
    NSString *theString2 = [NSString stringWithFormat:@"%C", theChar];
    NSLog(@"theString=%@,%d,%@,%@",theString,theChar,theString1,theString2);
    
    theString = @"家";
    theChar = [theString characterAtIndex:0];
    theString1 = [NSString stringWithFormat:@"%c", theChar];
    theString2 = [NSString stringWithFormat:@"%C", theChar];
    NSLog(@"theString=%@,%d,%@,%@",theString,theChar,theString1,theString2);
    
    theString = @"カントリー";
    theChar = [theString characterAtIndex:2];
    theString1 = [NSString stringWithFormat:@"%c", theChar];
    theString2 = [NSString stringWithFormat:@"%C", theChar];
    NSLog(@"theString=%@,%d,%@,%@",theString,theChar,theString1,theString2);

2013-09-12 15:36:27.849 XYShopping[1892:18e03] theString=g,103,g,g
2013-09-12 15:36:27.849 XYShopping[1892:18e03] theString=家,23478,?,家
2013-09-12 15:36:27.849 XYShopping[1892:18e03] theString=カントリー,12488,?,ト

显示结果表明,这个方法是正确的。对于两个字节组成的字符,是能显示出的。不知道其他语言会怎么样,没有条件去测试。


ASCII&Base64

阅读数 241