47
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
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.2254 Huy hiệu vàng33 Huy hiệu bạc47 Huy hiệu đồng4 gold badges33 silver badges47 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.078125
Trong 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.48712 Huy hiệu bạc24 Huy hiệu đồng12 silver badges24 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àng75 Huy hiệu bạc97 Huy hiệu Đồng8 gold badges75 silver badges97 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.6806078125E4
Tô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
179K66 Huy hiệu vàng208 Huy hiệu bạc256 Huy hiệu Đồng66 gold badges208 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
286K51 Huy hiệu vàng359 Huy hiệu bạc499 Huy hiệu đồng51 gold badges359 silver badges499 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
826K163 Huy hiệu vàng1203 Huy hiệu bạc1382 Huy hiệu Đồng163 gold badges1203 silver badges1382 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,9361 Huy hiệu vàng19 Huy hiệu bạc22 Huy hiệu đồng1 gold badge19 silver badges22 bronze badges
0