读取后整数转浮点数转换

0 投票
5 回答
761 浏览
提问于 2025-04-18 12:16

我有一些带符号的整数,每个都是从4个字节读取的,但它们其实应该先被当作浮点数来读取……所以这些值完全不对。

我该怎么转换这些数值呢?我无法读取原始文件,只能用这些错误的整数。

详细信息

我发现我的问题不太清楚。首先,请理解整数和浮点数的二进制格式之间的区别。

之前有一个(二进制)文件,每4个字节存储一个数字。 但最初的开发者认为这些是带符号的整数,所以他就这样读取了这些字节。然后他把它保存到了一个文本文件里:

1059629445
1061956142
1062430937
1062311316
1062487958

我得到了这个文本文件,但没有原始的二进制文件。我知道这些数字应该被当作浮点数读取(也是4个字节长)。而结果应该是这样的:

0.658837
0.797519
0.825819
0.818689
0.829217

我现在知道结果,因为我在这期间得到了二进制文件,但知道这个问题的答案会非常有用。

我该如何转换这些数字(也许这个词用得不太对,应该说是重新解释)?

5 个回答

0

如果你把整数(int)转换成浮点数(float),你会得到你想要的结果。

int myIntNum = 100;
float myFloatNum = (float)myIntNum;
0

你的问题不太清楚。我觉得这个可能对你有帮助...

int i=5;
printf("in float the value is=%f",(float)i);

输出结果会是浮点数。

1

下面的逻辑会对你有帮助

int a;
void *v;
fscanf(fp, "%d", &a);
v = &a;
fprintf(fp, "%f", *((float*)v));

在大多数系统中,float(浮点数)和int(整数)的大小都是4个字节。

1

假设 sizeof(int) == sizeof(float)

float res;
int value;
... 
memcpy(&res, &value, sizeof(res));
1

正如我之前在一个评论中提到的(现在已删除),这种处理方式可以通过使用struct模块来实现,而且通常都是这样做的。所以,假设你有一个文本文件,里面有你问题中提到的整数,下面是一个转换和重新解释的方式:

import struct

# convert integer on each line of text file into a list of Python int objects
with open('ints.txt') as ints_file:
    ints = [int(line) for line in ints_file]

# convert list of ints into list of 4-byte binary strings
binaries = [struct.pack('i', i) for i in ints]

# convert list of 4-byte binary strings into list of Python floating point values
floats = [struct.unpack('f', b)[0] for b in binaries]  # unpack() returns a tuple

print 'input:'
for value in ints:
    print '  {:d}'.format(value)
print
print 'results:'
for value in floats:
    print '  {:.5f}'.format(value)

输出结果:

input:
  1059629445
  1061956142
  1062430937
  1062311316
  1062487958

results:
  0.65884
  0.79752
  0.82582
  0.81869
  0.82922

这个过程可以优化和简化,实际上这样做可能更容易看出三个转换步骤是如何一个接一个地进行的:int()struct.pack()struct.unpack()

with open('ints.txt') as ints_file:
    print 'results:'
    for line in ints_file:
        print '  %.5f' % struct.unpack('f', struct.pack('i', int(line)))[0]

撰写回答