1
votes

Ok, first of, hello everyone :) I'm running Python 3.2 x86 @ windows

So I've got a binary file (6 412 bytes) with the following structure:

header: 256 bytes
maxZ: 4 bytes (1 32-bit word)
Zvalues: 2048 bytes (512 32-bit words)
maxX: *same as maxZ*
Xvalues: *same as Zvalues*
maxY: *same as maxZ*
Yvalues: *same as Zvalues*

I know (due to the format specs) that numbers are stored as 32-bit ints written as 2's complements

Say I don't need to read the header, here's what I do (I've got 1539 4-byte samples to read):

import struct
file = open('C:/02.adb', 'rb')
file.seek(256)
fmt = '<i'
nbytes = 4
for i in range(1539):
    packed_data = file.read(nbytes)
    unpacked_data = struct.unpack(fmt, packed_data)
    print('Sample: ',i,'Value: ',unpacked_data[0])
file.close()

That reads the file and prints it's contents to stdout, but there's something wrong with the signs. I guess I'm not reading numbers as 2's complements here... How do I improve the script?

tnx for the attention

addition (23.10.12):

I realised that by writing that short version of a larger external script I've just solved the main problem itself — my own mindlessness.

The number of samples that can be read from a header of the file isn't exact overall number of samples stored it in but the number of ZXY values combinations excluding those maximum amplitudes stored in the very first word of each channel's data block.

here's the final short version of script and it's output (and YES, python representation of signed ints is '2's complement'):

import struct
file = open('C:/02.adb', 'rb')
file.seek(256)
transfer_ratio = 31446.540881
fmt = '<i'
nbytes = 4
samples = []
for i in range(1539):
    packed_data = file.read(nbytes)
    unpacked_data = struct.unpack(fmt, packed_data)
    samples.append(int(unpacked_data[0])/transfer_ratio)
for i in range(32):
    print('Ch1_val: ',samples[i+1],' Ch2_val: ',samples[i+1+513],' Ch3_val: ',samples[i+1+(513*2)])
file.close()

output:

Ch1_val:  42.20127119933322  Ch2_val:  36.47237399942374  Ch3_val:  -3.4996535999447054
Ch1_val:  41.37017819934635  Ch2_val:  36.64441199942102  Ch3_val:  -4.35822179993114
Ch1_val:  42.43585979932951  Ch2_val:  34.9874729994472  Ch3_val:  -4.125827399934812
Ch1_val:  44.08278179930349  Ch2_val:  34.42912859945602  Ch3_val:  -4.1604257999342655
Ch1_val:  44.50289159929685  Ch2_val:  35.507053199438985  Ch3_val:  -3.092836199951133
Ch1_val:  43.69110119930968  Ch2_val:  35.53335179943857  Ch3_val:  -2.613991799958699
Ch1_val:  42.73662419932476  Ch2_val:  34.1708807994601  Ch3_val:  -5.254886399916972
Ch1_val:  42.14097839933417  Ch2_val:  34.08460739946146  Ch3_val:  -8.582724599864394
Ch1_val:  41.982105599336684  Ch2_val:  35.58544019943775  Ch3_val:  -8.84688719986022
Ch1_val:  42.503816399328436  Ch2_val:  36.06170879943022  Ch3_val:  -6.777056999892922
Ch1_val:  43.17568679931782  Ch2_val:  35.291926199442386  Ch3_val:  -4.984618199921243
Ch1_val:  42.4303583993296  Ch2_val:  36.03750899943061  Ch3_val:  -4.502275799928864
Ch1_val:  39.92264219936922  Ch2_val:  38.354075399394006  Ch3_val:  -6.050744999904398
Ch1_val:  37.65501599940505  Ch2_val:  38.48181599939198  Ch3_val:  -9.010943399857627
Ch1_val:  37.04642759941466  Ch2_val:  35.152642199444585  Ch3_val:  -9.89107199984372
Ch1_val:  36.571876199422164  Ch2_val:  32.21988719949093  Ch3_val:  -7.850465999875962
Ch1_val:  34.488403799455085  Ch2_val:  32.62164839948458  Ch3_val:  -7.712485799878142
Ch1_val:  32.00259779949436  Ch2_val:  34.05570119946192  Ch3_val:  -11.215064999822802
Ch1_val:  31.132422599508107  Ch2_val:  33.44755799947153  Ch3_val:  -12.461179799803112
Ch1_val:  31.245853199506314  Ch2_val:  31.730771399498654  Ch3_val:  -8.723057999862176
Ch1_val:  30.40820939951955  Ch2_val:  31.03355639950967  Ch3_val:  -6.433076399898357
Ch1_val:  28.474165199550107  Ch2_val:  30.714824999514704  Ch3_val:  -9.730672799846255
Ch1_val:  26.481449999581592  Ch2_val:  29.53720739953331  Ch3_val:  -13.227496199791005
Ch1_val:  24.79611359960822  Ch2_val:  28.60448159954805  Ch3_val:  -12.1075955998087
Ch1_val:  23.74938479962476  Ch2_val:  28.95253259954255  Ch3_val:  -9.411305399851301
Ch1_val:  23.92663799962196  Ch2_val:  29.24305739953796  Ch3_val:  -8.856490799860067
Ch1_val:  24.37285559961491  Ch2_val:  28.72398599954616  Ch3_val:  -9.611549999848137
Ch1_val:  23.155774199634138  Ch2_val:  29.22521759953824  Ch3_val:  -10.701304199830918
Ch1_val:  20.822671799671003  Ch2_val:  31.46641799950283  Ch3_val:  -12.57088979980138
Ch1_val:  20.15302739968158  Ch2_val:  32.95071479947938  Ch3_val:  -13.581175799785417
Ch1_val:  21.440195999661245  Ch2_val:  32.28628559948987  Ch3_val:  -11.66643419981567
Ch1_val:  21.51502139966006  Ch2_val:  31.7910959994977  Ch3_val:  -8.843802599860268
1
@MSN tnx, I guess the problem is solved for now, I added the output to my original post's body.Ilya Telegin

1 Answers

1
votes

I am fairly sure Python uses two's complement numbers for signed integers. One common problem is that of endianness. The spec should mention if the numbers are little endian or big endian. In Python you can load both with <i and >i.