Как преобразовать Python Float в байты для интерпретации в программе C ++ - PullRequest
1 голос
/ 06 июня 2019

Мне нужно создать скрипт Python, который экспортирует данные в пользовательский формат файла.Этот файл затем читается программой cpp (у меня есть исходный код, но я не могу его скомпилировать).

файл обычного файла: spec:

  • Файл должен иметь порядок байтов.
  • Число с плавающей точкой должно быть длиной 4 байта.

Я не могу экспортировать число с плавающей точкой в ​​байтах.таким образом сбой приложения cpp без какой-либо ошибки трассировки.Если я пытаюсь заполнить все значения с плавающей запятой 0, он прекрасно загружается, но если я пытаюсь сделать что-то еще, происходит сбой.

Вот как приложение cpp считывает значения с плавающей точкой

double Eds2ImporterFromMemory::read4BytesAsFloat(long offset) const
{
    // Read data.
    float i = 0;
    memcpy(&i, &_data[offset], 4);

    return i;
}

И япопробуйте экспортировать python float следующим образом:

def write_float(self, num):
    # pack float 
    self.f.write(struct.pack('<f', float(num)))

А также так, как мне предлагали некоторые люди:

def write_float(self, num):
    # unpack as integer the previously pack as float number    
    float_hex = struct.unpack('<I', struct.pack('<f', num))[0]
    self.f.write(float_hex.to_bytes(4, byteorder='little'))

Но каждый раз это не получается.Я не парень из cpp, как ты видишь.У вас есть идея, почему мой скрипт на python не работает.

Заранее спасибо

1 Ответ

0 голосов
/ 06 июня 2019

Пожалуйста, извините меня за то, что я действительно плох в Python, но я попытался дать желаемый результат, и он отлично работает для меня.

Код Python:

import struct

value = 13.37

ba = bytearray(struct.pack("f", value))  
for b in ba:
    print("%02x" % b)

Представляю, если бы вы просто согласились с этим (в основном записав шестнадцатеричное представление в файл в указанном порядке), он бы прекрасно работал.

В любом случае он выдаст

85
eb
55
41

, который я поместил в массив беззнаковых символов и использовал memcpy так же, как ваш код C ++:

unsigned char data[] = {0x85, 0xeb, 0x55, 0x41};

float f;
memcpy(&f, data, sizeof(float));

std::cout << f << std::endl;
std::cin.get();

, который будетвыведите 13.37, как и следовало ожидать.Если вы не можете воспроизвести правильный результат таким образом, я подозреваю, что ошибка происходит где-то еще, и в этом случае было бы полезно увидеть как формат написан на python и как он читается на C ++.

Также имейте в виду, что существует несколько способов представления массива байтов, например:

\x85eb5541, 0x85, 0xeb, 0x55, 0x41, 85eb5541 и так далее.Мне кажется очень вероятным, что вы просто не выводите правильный формат, и, таким образом, происходит сбой «парсера».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...