swift POS8583报文组装工具
最近两天在学习Swift,想着把OC里边的8583POS工具转成Swift版本。 今天做了几个转换工具 1、data转换为十六进制字符串 2、十六进制字符串转换为 data 3、十六进制字符串转为ASC码 4、ASC码转为十六进制字符串
代码如下
// // StringPosUtilTransExtension.swift // SwiftPOS // Created by 刘通超 on 15/12/16. // Copyright ? 2015年刘通超. All rights reserved. // import Foundation extension String{
//MARK: data 转换为十六进制字符串 /** data 转换为十六进制字符串 <24211D34 98FF62AF> --> "24211D3498FF62AF"
- parameter data: 要转换的data - returns: 转换后的字符串 */ static func hexStringFromData(data data:NSData)->String{ let dataLength = data.length let buffer = UnsafePointer<UInt8>(data.bytes) var result = "" for(var i=0;i<dataLength;i++){ let num = Int(buffer[i]&0xff) result += decIntToHexString(decNum: num) } return result }
//MARK: 十六 进制字符串转换为 data /** 十六 进制字符串转换为 data "24211D3498FF62AF" --> <24211D34 98FF62AF> - parameter hexStr: 要转换的字符串 - returns: 转换后的data数据 */ static func dataFromHexString(hexStr hexStr:String)->NSData{ let strLength = hexStr.utf16.count
let data = NSMutableData() for(var index=0; index+2<=strLength; index+=2){ let subStr = hexStr.substringWithRange(Range(start: hexStr.startIndex.advancedBy(index),end: hexStr.startIndex.advancedBy(index+2))) let dataInt = UnsafeMutablePointer<UInt32>.alloc(1) NSScanner.init(string: subStr).scanHexInt(dataInt)
data.appendBytes(dataInt,length: 1) } return data } //MARK: hex字符串转为ASC码 00 --> 3030 /** hex字符串转为ASC码 00 --> 3030 - parameter hexString: hex字符串 - returns: 转码后的ASC字符串 */ static func ascStringFromHexString(hexString:String)->String{ var result = "" let length = hexString.utf16.count let buffer = hexString.cStringUsingEncoding(NSUTF8StringEncoding) for(var i=0;i<length;i++){ result += decIntToHexString(decNum:Int(buffer![i])) } return result }
//MARK: ASC码转为Hex字符串 3030 --> 00 /** ASC码转为Hex字符串 3030 --> 00
- parameter ascStr: ASC字符串 - returns: 转码后的Hex字符串 */ static func hexStringFromAscString(ascStr ascStr:String)->String{
let dda = String.dataFromHexString(hexStr: ascStr)
let result = String.init(data: dda,encoding: NSUTF8StringEncoding)
return result! }
/** UInt8 十进制数转为十六进制字符串(两位) - parameter num: 十进制数字 - returns: 两位十六进制字符串 */ private staticfunc decIntToHexString(decNum num:Int)->String{ let temp = String(format: "%0x",arguments: [num]) let result = (temp.utf16.count <=1) ?"0"+temp: temp; return result }
} 亲测可用
let strToData =String.dataFromHexString(hexStr:"3132332e34353678") let dataToStr = String.hexStringFromData(data: strToData) let ascToHex = String.hexStringFromAscString(ascStr: dataToStr) let hexToAsc = String.ascStringFromHexString(ascToHex)
print("strToData:(strToData)") print("dataToStr:(dataToStr)") print("hexToAsc:(hexToAsc)") print("ascToHex:(ascToHex)")
strToData:<3132332e 34353678> dataToStr:3132332e34353678 hexToAsc:3132332e34353678 ascToHex:123.456x (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |