def clusterInfo
      return @clusterInfo unless @clusterInfo.nil?

      # MFT Entry 6 ==> BITMAP Information
      ad = mftEntry(6).attributeData
      data = ad.read(ad.length)
      ad.rewind

      c = data.unpack("b#{data.length * 8}")[0]
      nclusters = c.length
      on = c.count("1")
      uclusters = on
      fclusters = c.length - on

      @clusterInfo = {"total" => nclusters, "free" => fclusters, "used" => uclusters}
    end
def clusterInfo
      return @clusterInfo unless @clusterInfo.nil?

      # MFT Entry 6 ==> BITMAP Information
      ad = mftEntry(6).attributeData
      data = ad.read(ad.length)
      ad.rewind

      c = data.unpack("b#{data.length * 8}")[0]
      nclusters = c.length
      on = c.count("1")
      uclusters = on
      fclusters = c.length - on

      @clusterInfo = {"total" => nclusters, "free" => fclusters, "used" => uclusters}
    end
From "File System Forensic Analysis" by Brian Carrier

 The $Bitmap file, which is located in MFT entry 6, has a $DATA attribute that is used
 to manage the allocation status of clusters.  The bitmap data are organized into 1-byte
 values, and the least significant bit of each byte corresponds to the cluster that follows
 the cluster that the most significant bit of the previous byte corresponds to.