1

Redhat 6.3 上の Python 2.6

32 ビット浮動小数点値を 2 つのメモリ レジスタに保存し、最上位ワードと最下位ワードに分割するデバイスがあります。これをフロートに変換する必要があります。SO で見つかった次のコードを使用していますが、他の場所で見たコードに似ています

#!/usr/bin/env python
import sys
from ctypes import *
first  = sys.argv[1]
second = sys.argv[2]

reading_1 = str(hex(int(first)).lstrip("0x"))
reading_2 = str(hex(int(second)).lstrip("0x"))

sample = reading_1 + reading_2

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(sample)

レジスタ値の例は次のとおりです。

レジスター 1;16282 レジスター 2;60597

これにより、結果のフロートが生成されます

1.21034872532

完全に複雑な数値ですが、メモリ値が次のようになる場合があります。

レジスター 1;16282 レジスター 2;1147

この関数を使用すると、float になります。

1.46726675314e-36

これは驚くほど小さな数であり、正しいように見える数ではありません。このデバイスは、1.2、1.3 の範囲で読み取り値を生成する必要があります。

私が解決しようとしているのは、デバイスが偽の値をスローしているかどうか、または取得している値は正しいが、使用している関数がそれらを適切に変換できないかどうかです。

また、numpy やその性質のものなど、これを行うためのより良い方法はありますか? 私は手を上げて、オンラインの例からこのコードをコピーしたばかりで、それがどのように機能するかをほとんど理解していないと言います。

ありがとうございました。

4

2 に答える 2

7

生のバイトがある場合 (たとえば、メモリから、ファイルから、ネットワーク経由で読み取るなど) struct、これに使用できます。

>>> import struct
>>> struct.unpack('>f', '\x3f\x9a\xec\xb5')[0]
1.2103487253189087

ここに、\x3f\x9a\xec\xb5入力レジスター 16282 (hex 0x3f9a) と 60597 (hex 0xecb5) が文字列のバイトとして表されています。は>バイトオーダーマークです。

したがって、レジスタ値を取得する方法によっては、この方法を使用できる場合があります (たとえば、入力整数をバイト文字列に変換することにより)。structこれにも使用できます。これはあなたの2番目の例です:

>>> raw = struct.pack('>HH', 16282, 1147)    # from two unsigned shorts
>>> struct.unpack('>f', raw)[0]              # to one float
1.2032617330551147
于 2013-01-23T22:56:52.433 に答える
1

2 つの s を変換する方法は、エンディアンintについて暗黙の前提を置いていますが、これは間違っていると思います。

では、一歩下がってみましょう。最初の引数が最上位の単語で、2 番目の引数が最下位の単語であることがわかっています。したがって、適切な方法でそれらを 16 進数の文字列に結合する方法を見つけようとするのではなく、次のようにしましょう。

import struct
import sys

first  = sys.argv[1]
second = sys.argv[2]

sample = int(first) << 16 | int(second)

これで、次のように変換できます。

def convert(i):
    s = struct.pack('=i', i)
    return struct.unpack('=f', s)[0]

そして、あなたの入力で試してみると:

$ python floatify.py 16282 60597
1.21034872532
$ python floatify.py 16282 1147
1.20326173306
于 2013-01-23T23:09:14.883 に答える