繁体   English   中英

如何将UInt32转换为UInt8

[英]How to cast UInt32 to UInt8

我需要迅速将UInt32附加到NSMutableData对象。 问题是,我不知道如何访问int中的特定字节。

这是我尝试过的:

extension NSMutableData {

  enum Endianness {
    case LittleEndian, BigEndian
  }

  func appendUInt32(myInt: UInt32, endianness: Endianness = .LittleEndian) {
    var bytes = UInt8[]()
    for i in 0..sizeof(UInt32) {
      switch endianness {
        case .LittleEndian:
          bytes.append(UInt8(myInt >> i))
        case .BigEndian:
          bytes.append(UInt8(myInt >> (sizeof(UInt32) - 1 - i)))
      }
    }
    self.appendBytes(bytes, length:bytes.count)
  }
}

这引发了我无法从UInt32强制转换为UInt8的编译器异常。 有没有一种简单的方法可以简单地访问UInt32中的字节?

编辑:从评论总结最终解决方案:

extension NSMutableData {

  enum Endianness {
    case LittleEndian, BigEndian
  }

  func appendUInt32(myInt: UInt32, endianness: Endianness = .LittleEndian) {
    var bytes = UInt8[]()
    for i in 0..sizeof(UInt32) {
      switch endianness {
        case .LittleEndian:
          bytes.append(UInt8(myInt >> UInt32(i * 8) & UInt32(0xff)))
        case .BigEndian:
          bytes.append(UInt8(myInt >> UInt32((sizeof(UInt32) - 1 - i) * 8) & UInt32(0xff)))
      }
    }
    self.appendBytes(bytes, length:bytes.count)
  }
}

确保>>运算符的两个操作数都属于同一类型。 我使它们成为UInt32。

extension NSMutableData {

    enum Endianness {
        case LittleEndian, BigEndian
    }

    func appendUInt32(myInt: UInt32, endianness: Endianness = .LittleEndian) {
        var bytes = UInt8[]()
        for i in 0..sizeof(UInt32) {
            switch endianness {
            case .LittleEndian:
                bytes.append(UInt8(myInt >> UInt32(i)))
            case .BigEndian:
                bytes.append(UInt8(myInt >> UInt32((sizeof(UInt32) - 1 - i))))
            }
        }
        self.appendBytes(bytes, length:bytes.count)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM