Làm thế nào để chuyển đổi chuỗi hex sau thành float (chính xác 32 bit) trong Python?
"41973333" -> 1.88999996185302734375E1 "41995C29" -> 1.91700000762939453125E1 "470FC614" -> 3.6806078125E4
Mskfisher
3.2444 Huy hiệu vàng33 Huy hiệu bạc48 Huy hiệu đồng4 gold badges33 silver badges48 bronze badges
Hỏi ngày 20 tháng 10 năm 2009 lúc 2:32Oct 20, 2009 at 2:32
Trong Python 3:Python 3:
>>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125Trong Python 2:Python 2:
>>> import struct >>> struct.unpack('!f', '41973333'.decode('hex'))[0] 18.899999618530273 >>> struct.unpack('!f', '41995C29'.decode('hex'))[0] 19.170000076293945 >>> struct.unpack('!f', '470FC614'.decode('hex'))[0] 36806.078125
tay vịn
1.50414 Huy hiệu bạc26 Huy hiệu đồng14 silver badges26 bronze badges
Đã trả lời ngày 20 tháng 10 năm 2009 lúc 4:00Oct 20, 2009 at 4:00
Denis Otkidachdenis OtkidachDenis Otkidach
31.1k8 Huy hiệu vàng76 Huy hiệu bạc98 Huy hiệu Đồng8 gold badges76 silver badges98 bronze badges
5
Tôi khuyên bạn nên sử dụng mô -đun CTYPES về cơ bản cho phép bạn làm việc với các loại dữ liệu cấp thấp. Trong trường hợp của bạn, bạn có thể nói
from ctypes import * def convert(s): i = int(s, 16) # convert from hex to a Python int cp = pointer(c_int(i)) # make this into a c integer fp = cast(cp, POINTER(c_float)) # cast the int pointer to a float pointer return fp.contents.value # dereference the pointer, get the float print convert("41973333") # returns 1.88999996185302734375E1 print convert("41995C29") # returns 1.91700000762939453125E1 print convert("470FC614") # returns 3.6806078125E4Tôi tin rằng mô-đun >>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125 1 có ý nghĩa ở đây, bởi vì về cơ bản bạn đang hỏi làm thế nào để thực hiện đúc bit cấp thấp. Câu hỏi của bạn về cơ bản là làm thế nào để tôi nói với Python lấy một số dữ liệu và giải thích dữ liệu đó như thể những bit chính xác đó là một loại dữ liệu khác nhau?
Trong C Nếu bạn có INT và muốn giải thích các bit của nó như một chiếc phao, bạn sẽ làm điều tương tự, lấy một con trỏ và sau đó đúc và phá hủy nó:
int i = 0x41973333; float f = *((float*)&i);Và đó chính xác là những gì mã Python sử dụng thư viện >>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125 1 đang làm trong ví dụ của tôi.
Đã trả lời ngày 20 tháng 10 năm 2009 lúc 2:49Oct 20, 2009 at 2:49
Eli Courtwrighteli CourtwrightEli Courtwright
Phim thương hiệu vàng 180K6666 gold badges209 silver badges256 bronze badges
1
Tôi đoán câu hỏi này liên quan đến câu hỏi này và bạn đang làm việc với 4 byte thay vì 8 chữ số hex.
>>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125 3 là chuỗi 4 byte mặc dù nó trông giống như 16
>>> len("\x41\x91\x33\x33") 4 >>> import struct >>> struct.unpack(">fff","\x41\x97\x33\x33\x41\x99\x5C\x29\x47\x0F\xC6\x14") (18.899999618530273, 19.170000076293945, 36806.078125)Nếu bạn cần phải đối phó với chuỗi hexDigits chứ không phải là byte thực tế, bạn có thể sử dụng >>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125 4 để chuyển đổi nó, như thế này
>>> for hx in ["41973333","41995C29","470FC614"]: ... print(struct.unpack(">f",struct.pack(">i",int(hx,16)))[0]) ... 18.8999996185 19.1700000763 36806.078125
Đã trả lời ngày 20 tháng 10 năm 2009 lúc 2:37Oct 20, 2009 at 2:37
John La Rooyjohn La RooyJohn La Rooy
288K51 Huy hiệu vàng359 Huy hiệu bạc501 Huy hiệu đồng51 gold badges359 silver badges501 bronze badges
Cắt các chuỗi hex thành các khối 2 ký tự (byte), làm cho mỗi đoạn vào byte bên phải với định dạng int, struct.unpack khi thực hiện. I E.:
import struct testcases = { "41973333": 1.88999996185302734375E1, "41995C29": 1.91700000762939453125E1, "470FC614": 3.6806078125E4, } def hex2float(s): bins = ''.join(chr(int(s[x:x+2], 16)) for x in range(0, len(s), 2)) return struct.unpack('>f', bins)[0] for s in testcases: print hex2float(s), testcases[s]phát ra, như mong muốn:
18.8999996185 18.8999996185 19.1700000763 19.1700000763 36806.078125 36806.078125Đã trả lời ngày 20 tháng 10 năm 2009 lúc 2:58Oct 20, 2009 at 2:58
Alex Martellialex MartelliAlex Martelli
830K165 Huy hiệu vàng1205 Huy hiệu bạc1385 Huy hiệu Đồng165 gold badges1205 silver badges1385 bronze badges
Khi làm việc từ chuỗi và không phải cắt các giá trị hoặc chỉ mục.
import struct ... q = int('0x425c0000',16) b8 = struct.pack('i', q) dec, = struct.unpack('f', b8)Đã trả lời ngày 3 tháng 4 năm 2021 lúc 21:05Apr 3, 2021 at 21:05
Gentelmen ... kìa:
>>> import struct >>> struct.unpack('!f', bytes.fromhex('41973333'))[0] 18.899999618530273 >>> struct.unpack('!f', bytes.fromhex('41995C29'))[0] 19.170000076293945 >>> struct.unpack('!f', bytes.fromhex('470FC614'))[0] 36806.078125 0Xin lỗi vì một chút ".value" ở cuối ... mã này đã được sử dụng làm lớp trong chương trình của tôi trong gần 2 năm nay. (Với một chút chỉnh sửa, bạn có thể dễ dàng biến nó thành một chức năng)
this code has been used as a class in my program for nearly 2 years now.
(with a little editing, you can easily make it into a function)
Tín dụng cho Pytony tại Daniweb cho Bộ luật.
Không giống như điện toán không di động, mã không cứng với kích thước phao cố định và hoạt động với bất kỳ kích thước byte nào.
the code is not hard-wired to a fixed float size,
and works with any byte-size.
Mặc dù tôi đoán chúng ta vẫn còn một vài lỗi để làm việc. XDD (tôi sẽ chỉnh sửa mã này sau (nếu tôi có thể) với bản cập nhật)
(I'll edit this code later (if I can) with the update)
Tất cả đều tốt mặc dù bây giờ ... Tôi không gặp vấn đề gì khi chuyển đổi các mô hình trò chơi 3D với nó. :)
I havn't had a problem converting 3D game models with it. :)
Đã trả lời ngày 7 tháng 2 năm 2014 lúc 2:10Feb 7, 2014 at 2:10
TclltcllTcll
6,9661 Huy hiệu vàng19 Huy hiệu bạc22 Huy hiệu đồng1 gold badge19 silver badges22 bronze badges
0