Advertisement
JetForMe

BinaryReader

Jul 29th, 2020
1,966
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.47 KB | None
  1. //
  2. //  BinaryReader.swift
  3. //  TerrainFun
  4. //
  5. //  Created by Rick Mann on 2020-07-28.
  6. //  Copyright © 2020 Latency: Zero, LLC. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10.  
  11.  
  12.  
  13.  
  14. struct
  15. BinaryReader
  16. {
  17.     init(data inData: Data)
  18.     {
  19.         self.data = inData
  20.     }
  21.    
  22.     mutating
  23.     func
  24.     get<T>()
  25.         -> T where T : FixedWidthInteger
  26.     {
  27.         let size = MemoryLayout<T>.stride
  28.         let v: T = self.data[self.idx..<self.idx + size].withUnsafeBytes { $0.load(as: T.self) }
  29.         self.idx += size
  30.         if self.bigEndian
  31.         {
  32.             return T(bigEndian: v)
  33.         }
  34.         else
  35.         {
  36.             return T(littleEndian: v)
  37.         }
  38.     }
  39.    
  40.     mutating
  41.     func
  42.     getUInt16()
  43.         -> UInt16
  44.     {
  45.         get()
  46.     }
  47.    
  48.     mutating
  49.     func
  50.     getUInt23()
  51.         -> UInt32
  52.     {
  53.         let size = MemoryLayout<UInt32>.stride
  54.         let v: UInt32 = self.data[self.idx..<self.idx + size].withUnsafeBytes { $0.load(as: UInt32.self) }
  55.         self.idx += size
  56.         if self.bigEndian
  57.         {
  58.             return UInt32(bigEndian: v)
  59.         }
  60.         else
  61.         {
  62.             return UInt32(littleEndian: v)
  63.         }
  64.     }
  65.    
  66.     mutating
  67.     func
  68.     seek(by inDelta: Int)
  69.     {
  70.         self.idx += inDelta
  71.         precondition(self.idx >= 0 && self.idx < self.data.count, "seek(by: \(inDelta)) out of bounds")
  72.     }
  73.    
  74.     mutating
  75.     func
  76.     seek(to inOffset: Int)
  77.     {
  78.         precondition(inOffset >= 0 && inOffset < self.data.count, "seek(to: \(inOffset)) out of bounds")
  79.         self.idx = inOffset
  80.     }
  81.    
  82.     mutating
  83.     func
  84.     seek(to inOffset: UInt32)
  85.     {
  86.         seek(to: Int(inOffset))
  87.     }
  88.    
  89.     let data            :   Data
  90.     var idx                         =   0
  91.     var bigEndian                   =   true
  92. }
  93.  
Advertisement
RAW Paste Data Copied
Advertisement