>source

정수, 부동 소수점 등과 같은 일부 데이터를 파이썬으로 이진 파일로 내 보내야합니다. 나중에 C #으로 파일을 다시 읽어야하는데 작동하지 않습니다.

나는 파이썬으로 바이너리 파일을 작성하는 여러 가지 방법을 시도했고 파이썬으로도 읽는 한 작동합니다.

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)

현재 다음과 같이 C #으로 파일을 읽고 있습니다.

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가 아니며 대신 내 출력은 0입니다. 바이너리 파일을 올바르게 읽거나 쓰려면 어떻게해야합니까?

  • 답변 # 1

    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 # 코드가 작동합니다.

  • 답변 # 2

    파이썬이 C #이 예상하는 것과 동일한 형식으로 데이터를 쓰지 않을 수 있습니다. 바이트 엔디안을 바꾸거나 다른 작업을 수행해야 할 수 있습니다. 대신 원시 바이트를 읽고 사용할 수 있습니다. BitConverter 문제가 해결되는지 확인합니다.

    또 다른 옵션은 Python에서 명시 적으로 endianess를 지정하는 것입니다. Big endian은 C #의 기본 바이너리 리더 형식이라고 생각합니다.

    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'
    
    

관련 자료

  • 이전 r - 목록 내에서 한 벡터의 첫 번째 요소를 선택하는 방법
  • 다음 setup - ssh를 통해 사용될 PATH를 설정하는 방법