我正在使用iOS
Swift在Shapefile文件(一种GIS格式,与这个问题没有特别关系)中构建自定义文件打开器。这些文件的头长度为100个字节。我能够将其读入4字节的数组中,该数组存储了我想要的信息。我可以将这些数组转换为Swift类型Data
和NSData
,并具有其他一些转换它们的选项(例如Base64EncodedString
)。但我无法将这些原料阵列或数据或任何的格式转换成有用的属性等Double
,Int
和String
。
import Foundation
struct ShapeReader {
var shapeFile = FileHandle(forReadingAtPath: "/Users/christopherjlowrie/Documents/Shapes/SF_Neighborhoods/Planning_Zones.shp")
var fileHeader: String{
let header = shapeFile?.readData(ofLength: 100)
let headerStream = InputStream(data: header!)
headerStream.open()
var buffer = [UInt8](repeating: 0, count: 4)
while (headerStream.hasBytesAvailable){
headerStream.read(&buffer, maxLength: buffer.count)
print(buffer)
let x = Data(buffer)
print(x)
}
return "A"
}
}
当前这仅返回A,因为出于测试原因,我让它返回一个字符串
我怎么能打开文件,并阅读他们的原始字节分为不同的类型(Doubles
,Ints
,Strings
)的斯威夫特?
Xcode 11•Swift 5.1或更高版本
转换:String
或从任何Numeric
类型转换为Data
:
extension StringProtocol {
var data: Data { .init(utf8) }
}
extension Numeric {
var data: Data {
var source = self
// This will return 1 byte for 8-bit, 2 bytes for 16-bit, 4 bytes for 32-bit and 8 bytes for 64-bit binary integers. For floating point types it will return 4 bytes for single-precision, 8 bytes for double-precision and 16 bytes for extended precision.
return .init(bytes: &source, count: MemoryLayout<Self>.size)
}
}
从Data
(字节)转换回String
extension DataProtocol {
var string: String? { String(bytes: self, encoding: .utf8) }
}
从Data
原始Numeric
价值转换为一般价值
extension Numeric {
init<D: DataProtocol>(_ data: D) {
var value: Self = .zero
let size = withUnsafeMutableBytes(of: &value, { data.copyBytes(to: $0)} )
assert(size == MemoryLayout.size(ofValue: value))
self = value
}
}
extension DataProtocol {
func value<N: Numeric>() -> N { .init(self) }
}
let value = 12.34 // implicit Double 12.34
let data = value.data // double data - 8 bytes
let double = Double(data) // implicit Double 12.34
let double1: Double = .init(data) // explicit Double 12.34
let double2: Double = data.value() // explicit Double 12.34
let double3 = data.value() as Double // casting to Double 12.34
现在,我们可以轻松地为每种Numeric
类型添加一个属性:
extension DataProtocol {
var integer: Int { value() }
var int32: Int32 { value() }
var float: Float { value() }
var cgFloat: CGFloat { value() }
var float80: Float80 { value() }
var double: Double { value() }
var decimal: Decimal { value() }
}
游乐场测试
let intData = 1_234_567_890_123_456_789.data // 8 bytes (64 bit Integer)
let dataToInt: Int = intData.integer // 1234567890123456789
let intMinData = Int.min.data // 8 bytes (64 bit Integer)
let backToIntMin = intMinData.integer // -9223372036854775808
let intMaxData = Int.max.data // 8 bytes (64 bit Integer)
let backToIntMax = intMaxData.integer // 9223372036854775807
let myInt32Data = Int32(1_234_567_890).data // 4 bytes (32 bit Integer)
let backToInt32 = myInt32Data.int32 // 1234567890
let int32MinData = Int32.min.data // 4 bytes (32 bit Integer)
let backToInt32Min = int32MinData.int32 // -2147483648
let int32MaxData = Int32.max.data // 4 bytes (32 bit Integer)
let backToInt32Max = int32MaxData.int32 // 2147483647
let myFloatData = Float.pi.data // 4 bytes (32 bit single=precison FloatingPoint)
let backToFloat = myFloatData.float // 3.141593
backToFloat == .pi // true
let myCGFloatData = CGFloat.pi.data // 4 bytes (32 bit single=precison FloatingPoint)
let backToCGFloat = myCGFloatData.cgFloat // 3.141593
backToCGFloat == .pi // true
let myDoubleData = Double.pi.data // 8 bytes (64 bit double-precision FloatingPoint)
let backToDouble = myDoubleData.double // 3.141592653589793
backToDouble == .pi // true
let myFloat80Data = Float80.pi.data // 16 bytes (128 bit extended-precision FloatingPoint)
let backToFloat80 = myFloat80Data.float80 // 3.141592653589793116
backToFloat80 == .pi // true
let decimalData = Decimal.pi.data // 20 bytes Decimal type
let backToDecimal = decimalData.decimal // 3.14159265358979323846264338327950288419
backToDecimal == .pi // true
let stringBytes = "Hello World !!!".data.prefix(4) // 4 bytes
let backToString = stringBytes.string // "Hell"
问题内容: 我想将字符串中包含的字母的索引转换为整数值。尝试读取头文件,但找不到的类型,尽管它似乎符合使用方法的协议(例如)。 任何帮助表示赞赏。 问题答案: 编辑/更新: Xcode 11•Swift 5.1或更高版本 游乐场测试
问题内容: 我想从服务器中获取JSON数据并在启动时对其进行操作。在Objective- C中,我使用此代码转换为,因为获取的数据有时可能包含null。 但是,在Swift中,可以将转换为吗?我想使用以下操作(代码是Objective-C的): 在上面的代码中,当获取的数据的键为时,则对象的属性设置为。 我使用Xcode 6 Beta 6。 问题答案: 这可能是您要寻找的:
问题内容: 我从NSData的Web服务响应中接收到base64String,如何快速将base64String转换为String? 如果文件包含某些表格式/图像,则编码和解码都会给出无效的base64String,base64String的编码和解码可以很好地用于仅包含文本的文件。如何将文件转换为base64String进行编码和解码,无论文件内容如何?文件格式为doc,docx,pdf,txt
问题内容: 我在Swift 中将元素转换为,然后将变量转换回时遇到了问题。 首先,我想提取以下JSON数据的元素: 放入NSData 变量,但似乎无法做到这一点。我用来解析如下: 但这给了我一个ScalarNumber数组,我不知道如何存储到一个对象中。 其次,我想从同一个对象生成回来: 但是NSData 对象不会转换为[-67,51,-38,61,-72,102,48],它只是使JSON字符串无
问题内容: 我在这里经历了十分钟的挣扎和失败,我屈服了。我需要在Swift中将Int转换为Character并无法解决。 题 如何在Swift中将( 整数 )( 铸造 )转换为( 字符 )? 说明性问题/任务挑战 生成一个for循环,该循环打印字母“ A”至“ Z”,例如: 问题答案: 您不能将整数直接转换为实例,但是可以将整数从转换为并再次返回:
有这样的错误: [42000][257]从数据类型“NUMERIC”到“VARCHAR”的隐式转换 [42000][257]从数据类型“INT”到“VARCHAR”的隐式转换是