Ứng dụng của tôi sử dụng cấu trúc dữ liệu có thể inmutable hơi phức tạp được mã hóa trong tệp nhị phân. Tôi cần phải có quyền truy cập vào nó ở cấp độ byte, tránh bất kỳ sao chép. Thông thường, tôi sẽ sử dụng số học và con trỏ C hoặc C++, để truy cập và giải thích các giá trị byte thô. Tôi muốn làm như vậy với Swift.Con trỏ, Số học con trỏ và Dữ liệu thô trong Swift
Tôi đã phát hiện ra rằng các công việc sau:
class RawData {
var data: NSData!
init(rawData: NSData) {
data = rawData
}
func read<T>(byteLocation: Int) -> T {
let bytes = data.subdataWithRange(NSMakeRange(byteLocation, sizeof(T))).bytes
return UnsafePointer<T>(bytes).memory
}
func example_ReadAnIntAtByteLocation5() -> Int {
return read(5) as Int
}
}
Tuy nhiên, tôi không chắc chắn hiệu quả như thế nào nó được. Do data.subdataWithRange
và NSMakeRange
phân bổ các đối tượng mỗi khi tôi gọi cho chúng hay chúng chỉ là cú pháp để xử lý con trỏ?
Có cách nào tốt hơn để thực hiện việc này trong Swift không?
EDIT:
Tôi đã tạo ra một lớp Objective-C nhỏ mà chỉ gói gọn một chức năng để bù đắp một con trỏ bởi một số lượng nhất định của byte:
@implementation RawDataOffsetPointer
inline void* offsetPointer(void* ptr, int bytes){
return (char*)ptr + bytes;
}
@end
Nếu tôi bao gồm lớp này trong tiêu đề bắc cầu, sau đó tôi có thể thay đổi phương thức read
của mình thành
func read<T>(byteLocation: Int) -> T {
let ptr = offsetPointer(data.bytes, CInt(byteLocation))
return UnsafePointer<T>(ptr).memory
}
sẽ không sao chép dữ liệu từ b của tôi uffer, hoặc phân bổ các đối tượng khác.
Tuy nhiên, sẽ vẫn tốt hơn khi thực hiện một số số học con trỏ từ Swift, nếu có thể.
Ruột của tôi nói rằng nếu các subdata là bất biến, nhanh chóng sẽ không bận tâm để sao chép nó. –
Chỉ cần vào thời điểm này - có cách nào trong Swift để đọc một dòng 'UInt8' từ một NSData một cách hoàn toàn an toàn không? Hoặc từ một tập tin thậm chí? Tôi đang sử dụng điệu nhảy NSData/subdata này trong tệp nhị phân dingus Tôi đang viết ngay bây giờ, tôi thực sự ghét nhìn vào điều đó "vô nghĩa" vô nghĩa nhưng có vẻ như cách duy nhất tôi có thể lấy byte thô ra khỏi tệp. – iluvcapra