Как преобразовать данные в шестнадцатеричном виде в значение float в формате IEEE 754 в swift [duplicate]

Некоторые ответы частично ошибочны, и некоторые факты в них также частично ошибочны.

Ответьте на свой вопрос: Да! Вы можете.

В Typcript

class A {
    private a1;
    private a2;


}

Создает следующий код в Javascript:

var A = /** @class */ (function () {
    function A() {
    }
    return A;
}());

как @Erik_Cupal , вы можете просто сделать:

let a = new A();
let array = return Object.getOwnPropertyNames(a);

Но это неполное. Что произойдет, если ваш класс имеет собственный конструктор? Вам нужно сделать трюк с Typcript, потому что он не будет компилироваться. Вам нужно назначить любое:

let className:any = A;
let a = new className();// the members will have value undefined

Общее решение будет:

class A {
    private a1;
    private a2;
    constructor(a1:number, a2:string){
        this.a1 = a1;
        this.a2 = a2;
    }
}

class Describer{

   describeClass( typeOfClass:any){
       let a = new typeOfClass();
       let array = Object.getOwnPropertyNames(a);
       return array;//you can apply any filter here
   }
}

Для лучшего понимания это будет ссылаться в зависимости от контекста.

3
задан Nisha Nair 15 December 2016 в 10:47
поделиться

2 ответа

<44fa0000> является представлением памяти большого двоичного числа двоичного числа с плавающей запятой 2000.0. Чтобы получить номер обратно из данных, вы должны сначала прочитать его в UInt32, преобразовать из бай-тина с бай-тином в главный, а затем передать результат в Float.

В Swift 2, который был бы

func floatValueFromData(data: NSData) -> Float {
    return unsafeBitCast(UInt32(bigEndian: UnsafePointer(data.bytes).memory), Float.self)
}

Пример:

let bytes: [UInt8] =  [0x44, 0xFA, 0x00, 0x00]
let data = NSData(bytes: bytes, length: 4)

print(data) // <44fa0000>
let f = floatValueFromData(data)
print(f) // 2000.0

В Swift 3 вы использовали бы Data вместо NSData, а unsafeBitCast можно заменить на инициализатор Float(bitPattern:):

func floatValue(data: Data) -> Float {
    return Float(bitPattern: UInt32(bigEndian: data.withUnsafeBytes { $0.pointee } ))
}
8
ответ дан Martin R 19 August 2018 в 08:36
поделиться
  • 1
    Большое спасибо martin .. :) – Nisha Nair 15 December 2016 в 13:29
  • 2
    @MartinR Можете ли вы добавить реверс этого процесса, означает float to bytes, это очень срочно. – Varun Naharia 4 October 2017 в 13:10

Используйте эту функцию:

static func returnFloatValue(data: NSMutableData) -> Float {
    let bytes = [UInt8](data as Data)
    var f: Float = 0

    memcpy(&f, bytes, 4)
    return f
}

И вы можете увидеть ее в действии здесь:

var initialValue: Float = 19.200

let data = NSMutableData(bytes: &initialValue, length: 4)

func returnFloatValue(data: NSMutableData) -> Float {
    let bytes = [UInt8](data as Data)
    var f: Float = 0

    memcpy(&f, bytes, 4)
    return f
}

var result:Float = returnFloatValue(data: data)

print("f=\(result)")// f=19.2
0
ответ дан vladiulianbogdan 19 August 2018 в 08:36
поделиться
  • 1
    Я получаю эту ошибку Не могу отличить значение типа «Swift.Int» (0x111dbd1a0) до «Swift.UInt8» (0x111dbc858). – Nisha Nair 15 December 2016 в 12:25
  • 2
    Какую быструю версию вы используете? – vladiulianbogdan 15 December 2016 в 13:10
Другие вопросы по тегам:

Похожие вопросы: