Мне нужно экспортировать некоторые данные, такие как целые числа, числа с плавающей запятой и т. д., в двоичный файл с помощью python. После этого мне нужно снова прочитать файл с С#, но у меня это не работает.
Я попробовал несколько способов написать двоичный файл с помощью python, и он работает, пока я читаю его с помощью python:
a = 3
b = 5
with open('test.tcd', 'wb') as file:
file.write(bytes(a))
file.write(bytes(b))
или написать так:
import pickle as p
with open('test.tcd', 'wb') as file:
p.dump([a, b], file)
В настоящее время я читаю файл на С# следующим образом:
static void LoadFile(String path)
{
BinaryReader br = new BinaryReader(new FileStream(path, FileMode.Open));
int a = br.ReadInt32();
int b = br.ReadInt32();
System.Diagnostics.Debug.WriteLine(a);
System.Diagnostics.Debug.WriteLine(b);
br.Close();
}
К сожалению, вывод не 3 и 5, вместо этого мой вывод просто нулевой. Как правильно читать или записывать двоичный файл?
Возможно, Python записывает данные не в том формате, который ожидает C#. Возможно, вам придется поменять порядок следования байтов или сделать что-то еще. Вместо этого вы можете прочитать необработанные байты и использовать BitConverter
, чтобы увидеть, исправит ли это проблему.
Другой вариант - явно указать порядок байтов в python, я думаю, что большой порядок байтов является форматом двоичного чтения по умолчанию для С#.
an_int = 5
a_bytes_big = an_int.to_bytes(2, 'big')
print(a_bytes_big)
Output
b'\x00\x05'
a_bytes_little = an_int.to_bytes(2, 'little')
print(a_bytes_little)
Output
b'\x05\x00'
В Python вы должны записывать свои целые числа по 4 байта каждое. Подробнее читайте здесь: struct.pack
a = 3
b = 5
with open('test.tcd', 'wb') as file:
f.write(struct.pack("<i", 3))
f.write(struct.pack("<i", 5))
Теперь ваш код C# должен работать.
Большое спасибо! это сработало отлично, и спасибо за добавление ссылки на struct.pack! :д
Я бы использовал для этого какой-нибудь формат файла: csv, avro и т. д., для которых оба языка имеют библиотеки. Если в вашем случае это невозможно, то следует уточнить вопрос.