2010-06-17 41 views
5

Làm cách nào để kết hợp 2 int vào một điểm nổi IEEE 32 bit đơn lẻ? (mỗi trong số 2 ints đại diện cho 16 bit) Và theo hướng ngược lại: Làm thế nào tôi có thể chuyển đổi một phao python thành 2 ints 16 bit?Python: chuyển đổi 2 int thành 32 float

(Tôi cần điều này vì giao thức modbus - nơi 2x16 thanh ghi bit được coi là số 32 điểm nổi duy nhất)

+0

Hãy cảnh giác với việc xử lý Python nổi dưới dạng IEEE 32 bit - chúng thực sự là 64 bit. Vì vậy, nếu bạn giải nén 32 bit của bạn đến một phao nó thực sự sẽ là 64-bit, và tôi không chắc chắn về tác động làm tròn của điều đó. –

Trả lời

3

Mã này lấy 16 bit số nguyên i1 và i2 và chuyển đổi chúng thành số dấu phẩy động 3.14 và ngược lại.

from struct import * 
# Two integers to a floating point 
i1 = 0xC3F5 
i2 = 0x4840 
f = unpack('f',pack('>HH',i1,i2))[0] 

# Floating point to two integers 
i1, i2 = unpack('>HH',pack('f',3.14)) 
+1

Điều này không phải lúc nào cũng hoạt động. Ví dụ trên máy tính của tôi nếu tôi thử 'i1 = i2 = 32895', tạo' f' và sau đó giải nén lại, tôi lấy 'i2' trở lại là 49279. Trong trường hợp này, vì điểm nổi được tạo ra là' nan', một số đặc điểm đặc biệt. –

+0

Nếu đó là một vấn đề đối với OP, ông có thể kiểm tra nếu f là nan: nếu math.isnan (f): i1 = i2 = 32.895 khác: i1, i2 = giải nén ('> HH', pack ('f', f)) Hoặc anh ta có thể thử python-bitstring (http://code.google.com/p/python-bitstring/). Có phải nó xử lý trường hợp này một cách chính xác? – Alejandro

+0

Tôi không nghĩ rằng nên kiểm tra nan (có nhiều kết hợp không theo cùng một cách - tôi chỉ đưa ra một ví dụ). Mô-đun bitstring sẽ không giúp ích cho vấn đề cơ bản của việc đi qua kiểu float Python (nó sử dụng cấu trúc bên trong trong mọi trường hợp). Giải pháp là giữ dữ liệu dưới dạng byte (cho chuỗi bit nào có thể hữu ích), nhưng chi tiết phụ thuộc vào bản chất chính xác của vấn đề của OP. –

0

Tiêu chuẩn struct mô-đun có thể được sử dụng để thực hiện điều này một cách dễ dàng. Chỉ cần cẩn thận với endianess nền tảng của bạn nhưng, ngoài ra, nó phải là một ứng dụng khá thẳng về phía trước của pack()unpack().

+0

giống như giải nén ('> f', gói ('hh, int1, int2)) ?? – GabiMe

+0

Đúng. Nếu nó không "chỉ hoạt động", có thể bạn đang gặp phải vấn đề về endianess. Cách dễ nhất tôi đã tìm ra để tìm ra những gì đang xảy ra là sử dụng một kịch bản thử nghiệm nhỏ với hằng số thập lục phân mà bạn có thể sử dụng trong khi bạn fiddle với các gói/giải nén tùy chọn cho đến khi bạn nhận được kết quả bạn đang tìm kiếm. – Rakis

+0

Tôi không nghĩ rằng phương pháp này sẽ làm việc đáng tin cậy - xem bình luận của tôi về câu trả lời của Alejandro. –

Các vấn đề liên quan