none
C# BinaryWriter 사용할때 맨앞쪽 "." 점이 생기는 이유 RRS feed

  • 질문

  • 어떻게 해야지 바이너리 주소맨앞부터 쓸수 있는지 궁급합니다.

    FileStream fs = new FileStream(@"TEST1.bin", FileMode.OpenOrCreate,FileAccess.ReadWrite);
                BinaryWriter bw = new BinaryWriter(fs,Encoding.Unicode);
                bw.Write("BU");

    일단은 이렇게 하고 있는데

    아무것도 안들어가있는 빈파일에 맨앞부터 쓸려고 하는데

    결과로는 00000000 02 42 55                                                .BU

    이렇게 바이너리가 써지는데 BU 앞에있는 점을 없애고 싶습니다.

    왜그러는지도 궁금하구요.

    2017년 2월 8일 수요일 오전 9:35

답변

  • 바이너리 파일에 BU라는 스트링을 쓸 때, 이것은 단순히 2바이트의 두 캐릭터의 묶음이 아니라 유니코드로 계산되므로 추가적인 데이터가 더 들어갔을 것입니다. 이런 동작을 방지하기 위해서는 문자열을 바이트 배열로 변환하여 저장하고, 불러올 때도 바이트로 읽어와서 스트링으로 변환하면 경험하시는 문제가 방지될 것입니다.

    좀 조악하지만 대략적으로 코드를 짜보자면 다음과 같습니다.

    string s = "BUDUSTART";
    string fileName = "TEST1.bin";
    
    byte[] byteWrite = System.Text.Encoding.ASCII.GetBytes(s);
    BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.None));
    
    writer.Write(byteWrite);
    writer.Close();
    
    byte[] byteRead;
    string str;
    
    using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
    {
        byteRead = reader.ReadBytes(9);
        str = System.Text.Encoding.UTF8.GetString(byteRead, 0, byteRead.Length);
        Console.WriteLine("The string in the TEST1.bin is: " + str);
    }

    결과물:
    The string in the TEST1.bin is: BUDUSTART

    TEST1.bin 내용:
    00000000 42 55 44 55 53 54 41 52  54     BUDUSTART


    2017년 4월 14일 금요일 오전 7:50

모든 응답

  • 바이너리 파일에 BU라는 스트링을 쓸 때, 이것은 단순히 2바이트의 두 캐릭터의 묶음이 아니라 유니코드로 계산되므로 추가적인 데이터가 더 들어갔을 것입니다. 이런 동작을 방지하기 위해서는 문자열을 바이트 배열로 변환하여 저장하고, 불러올 때도 바이트로 읽어와서 스트링으로 변환하면 경험하시는 문제가 방지될 것입니다.

    좀 조악하지만 대략적으로 코드를 짜보자면 다음과 같습니다.

    string s = "BUDUSTART";
    string fileName = "TEST1.bin";
    
    byte[] byteWrite = System.Text.Encoding.ASCII.GetBytes(s);
    BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.None));
    
    writer.Write(byteWrite);
    writer.Close();
    
    byte[] byteRead;
    string str;
    
    using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
    {
        byteRead = reader.ReadBytes(9);
        str = System.Text.Encoding.UTF8.GetString(byteRead, 0, byteRead.Length);
        Console.WriteLine("The string in the TEST1.bin is: " + str);
    }

    결과물:
    The string in the TEST1.bin is: BUDUSTART

    TEST1.bin 내용:
    00000000 42 55 44 55 53 54 41 52  54     BUDUSTART


    2017년 4월 14일 금요일 오전 7:50
  • 답을 쓰고 보니 byteRead = reader.ReadBytes(9) 이 부분이 조금 애매해졌는데, 9는 제가 길이를 확인해서 임의로 넣은 값이고, 저 부분을 가져오는 부분에 대해서만 추가로 고민하시면 될 것 같습니다.
    2017년 4월 14일 금요일 오전 8:01