如何在Swift中读取和写入内存块中的位

如何在Swift中读取和写入内存块中的位,swift,memory,bit-manipulation,Swift,Memory,Bit Manipulation,我想知道如何将二进制文件读入内存(将其像JavaScript中的“数组缓冲区”一样写入内存),并将8位、16位、32位等值写入内存的不同部分,甚至5位或10位值 extension Binary { static func readFileToMemory(_ file) -> ArrayBuffer { let data = NSData(contentsOfFile: "/path/to/file/7CHands.dat")! var dataRan

我想知道如何将二进制文件读入内存(将其像JavaScript中的“数组缓冲区”一样写入内存),并将8位、16位、32位等值写入内存的不同部分,甚至5位或10位值

extension Binary {
  static func readFileToMemory(_ file) -> ArrayBuffer {        
    let data = NSData(contentsOfFile: "/path/to/file/7CHands.dat")!
    var dataRange = NSRange(location: 0, length: ?)
    var ? = [Int32](count: ?, repeatedValue: ?)
    data.getBytes(&?, range: dataRange)
  }

  static func writeToMemory(_ buffer, location, value) {
    buffer[location] = value
  }

  static func readFromMemory(_ buffer, location) {
    return buffer[location]
  }
}
我看了很多地方,但还没有找到一个标准的参考

我希望这是尽可能低的水平。因此,可能使用、
UnsafePointer
,或

Saw还包括:

let data=NSMutableData()
变量goesIn:Int32=42
data.appendBytes(&goesIn,长度:sizeof(Int32))

println(data)//如果您要查找低级代码,则需要使用
UnsafeMutableRawPointer
。这是指向非类型化数据的指针。内存是以字节为单位访问的,所以至少有8位的8个块。我将首先讨论8位的倍数

读取文件 要以这种方式读取文件,您需要自己管理文件句柄和指针。请尝试以下代码:

//以读取模式打开文件
让file=fopen(“/Users/joannisorlandos/Desktop/owner”,“r”)
//需要手动关闭文件
延迟{fclose(文件)}
//找到终点
fseek(文件,0,SEEK\u结束)
//从头到尾计算字节数
让fileByteSize=ftell(文件)
//回到起点
fseek(文件,0,搜索集)
//1字节实体缓冲区
let pointer=unsafemtablerawpointer.allocate(字节数:fileByteSize,对齐方式:1)
//缓冲区需要手动清理
延迟{pointer.deallocate()}
//大小为1字节
让readBytes=fread(指针,1,fileByteSize,文件)
let ErrorOccessed=readBytes!=文件字节大小
首先,您需要打开该文件。这可以使用Swift字符串来完成,因为编译器会将它们自身变成CString

因为清理是我们在这个低级别上的全部工作,所以会在最后放置一个延迟来关闭文件

接下来,将文件设置为查找文件的结尾。然后计算文件起点和终点之间的距离。这将在以后使用,因此保留该值

然后程序被设置为返回到文件的开头,因此应用程序从开头开始读取

要存储文件,将为指针分配文件在文件系统中的字节数。注意:如果您非常不走运,或者文件被频繁访问,则这可能会在两个步骤之间发生变化。但我认为对你来说,这是不可能的

字节数已设置,并与一个字节对齐。(您可以在上了解有关内存对齐的更多信息

然后添加另一个延迟,以确保代码末尾没有内存泄漏。指针需要手动释放

读取文件的字节并将其存储在指针中。请注意,整个过程以阻塞方式读取文件。如果您计划异步读取文件,则更倾向于异步读取,我建议您查看类似的库

erroroccurrent
可用于抛出错误或以其他方式处理问题

从这里开始,您的缓冲区已准备好进行操作。如果文件是文本,您可以使用以下代码打印该文件:

print(字符串(cString:pointer.bindMemory(to:Int8.self,capacity:fileByteSize)))
从这里开始,是学习如何阅读和操作记忆的时候了

操纵内存
下面演示如何读取字节
20!
let data = NSMutableData()
var goesIn: Int32 = 42
data.appendBytes(&goesIn, length: sizeof(Int32))
println(data) // <2a000000]

var comesOut: Int32 = 0
data.getBytes(&comesOut, range: NSMakeRange(0, sizeof(Int32)))
println(comesOut) // 42
let rawData = UnsafeMutablePointer<UInt8>.allocate(capacity: width * height * 4)