2013-02-01 1 views
2

저는 취미로 게임 프로젝트를 코딩하고 있습니다. 현재 일부 리소스 데이터 (예 : .BMPs)를 내 파일 형식으로 저장해야하므로 게임에서 모든 데이터를 구문 분석 할 수 있습니다. 화면에로드하십시오.왜 바이너리 파일을 읽고 쓰어야합니까?

BMP를 읽으려면 머리글을 읽은 다음 각 픽셀의 RGB 데이터를 읽고 이러한 값을 저장하는 [width] [height] 배열이 있습니다.

나는 바이너리 형식으로 이러한 유형의 데이터를 저장해야한다고 말했지만 그 이유는 아닙니다. 바이너리와 그게 무엇인지 (데이터의 0-1 표현)에 대해 읽었지 만, 예를 들어 .BMP 데이터를 저장하는 데 사용해야하는 이유는 무엇입니까? 게임에서 나중에 읽으려는 경우 더 복잡해지고로드 프로세스가 느려지는 것일까 요?

마지막으로, 바이너리로 저장하는 것이 더 좋다면 (다른 게임 리소스 파일에서 조사한 것에서 모두가 그렇게 생각하는 것처럼 보입니다) 어떻게 C++에서 이진 파일을 읽고 쓰는지 ? 많은 다양한 유형의 변수에 대해 여러 가지 방법으로 많은 질문을 보았습니다. 그래서 어느 것이 가장 좋으며/더 많은 C++ ish 방법을 요구하고 있습니까?

+0

bmp는 다른 사람이 사용할 수있는 형식의 형식입니다. 사용하려는 경우 일반적으로 bmp 파일을 열 수있는 다른 프로그램도 해당 형식을 읽을 수 있도록 해당 형식으로 작성해야합니다. 오직 당신이 그 파일을 읽을 수 있기를 원한다면, 원하는 포맷으로 파일을 저장하십시오. 그러나 사람들이 다른 포맷으로 잘못 이해할 수있는 방식으로 파일의 이름을 지정하지 마십시오. – PlasmaHH

+0

여기서 바이너리는 텍스트가 아님을 의미합니다. –

답변

8

당신은 모든 것을 거꾸로 가지고 있습니다. 컴퓨터 프로세서는 바이너리 수준의 데이터로 작동합니다. 컴퓨터의 모든 것은 바이너리입니다. 사람이 읽을 수있는 형태로 데이터를 처리하기 위해 우리는 인간이 이해할 수있는 것과 같은 바이너리 데이터를 만들기 위해 농구를 뛰어 넘는 함수를 작성합니다. 따라서 .BMP 데이터를 텍스트로 파일에 저장하는 경우 실제로 .BMP 데이터를 자연 바이너리 형식에서 텍스트로 변환 한 다음 텍스트 형식에서 다시 바이너리로 변환하는 작업을 컴퓨터가 수행하게됩니다 그것을 표시하기 위해.

진실은 원시 바이너리 형식으로 데이터를 처리 할 수 ​​있으면 더 빨리 코드를 실행할 수 있다는 것입니다. 전환 수가 적을수록 코드가 빠릅니다. 하지만 분명히 절충안이 있습니다. 매직 디코더 링을 꺼내지 않고도 데이터를보고 이해할 수 있어야한다면 텍스트로 파일에 저장할 수 있습니다. 그러나 그렇게하면서 우리는 말했듯이 사람이 읽을 수있는 텍스트를 순수한 바이너리 데이터로만 작동시키는 프로세서에 의미있는 텍스트를 만들기 위해 수행되어야하는 변환 처리가 있다는 것을 이해해야합니다. 다음,


그리고, 그냥 경우에 당신은 이미 알고 또는 정렬의이 - 알고 - 그것, 당신의 질문은 "왜 바이너리 모드로 내 .BMP 파일을 열고 텍스트가 아닌 모드로해야한다"했다 이유는 텍스트 모드에서 파일을 열면 플랫폼에 따라 필요에 따라 플랫폼에서 CRLF에서 LF 로의 변환 ("\ r \ n"에서 "\ n"변환)을 수행하도록 요청하기 때문에 내부 문자열 처리 수준, 당신이 상대하는 것은 '\ n'문자입니다. 파일이 2 진 데이터로 구성된 경우, 해당 변환을 계속 수행하지 않아야합니다. 그렇지 않으면 읽은 파일의 데이터가 손상됩니다. 이 상태에서는 대부분의 데이터가 정상적으로 작동하고 대부분의 경우 정상적으로 작동하지만 간혹 0x0d, 0x0a (십진수 13,10)의 16 진수 형식의 바이트 쌍을 가로 질러 변환됩니다. 0x0a (10)로 설정하면 읽을 데이터의 1 바이트가 누락됩니다. 바이너리 파일을 바이너리 모드로 열어야합니다! (아래) 가장 최근의 코멘트에 따라


확인은 여기있다 :

당신이 (지금은?) 이해, 컴퓨터에서 데이터가 바이너리 형식으로 저장되기 때문에. 예, 0과 1의 의미입니다. 그러나 프로그래밍 할 때 어떤 이유로 든 비트 논리 연산을 수행하지 않는 한 실제로 0과 1을 직접 사용하지 않아도됩니다. 예를 들어, int이라고하는 변수 유형은 개별 비트의 모음이며 각 비트는 0 또는 1 일 수 있습니다.또한 바이트 집합이며 바이트에 8 비트가 있다고 가정하면 플랫폼 및 컴파일러 옵션에 따라 int에 일반적으로 2, 4 또는 8 바이트가 있습니다. 하지만 intint으로 사용하고 개별 0 및 1로 사용하지 마세요. 그 int을 가장 순수한 형식의 파일에 쓰면 바이트 (따라서 비트)가 변환되지 않은 원시 형식으로 기록됩니다. 하지만 ASCII 텍스트로 변환하여 쓸 수도 있습니다. 화면에 int을 표시하는 경우 개별 0과 1을 보지 않으려면 ASCII 형식으로 인쇄하십시오. 일반적으로 십진수로 디코드됩니다. 동일한 int을 16 진수 형식으로 쉽게 인쇄 할 수 있으며 결과는 동일한 숫자 임에도 불구하고 다르게 보일 수 있습니다. 예를 들어, 10 진수로 10 진수 값 65를 가질 수 있습니다. 16 진수의 동일한 값은 0x41입니다 (또는 기본 16에 있음을 알면 41에 불과합니다). 우리가 ASCII 형식으로 표시하고 (예 : 2, -4 또는 8 바이트의 하위 바이트 만 고려하면 int, 즉 char으로 처리하는 경우) 동일한 값이 문자 'A'입니다.

나머지 설명에서는 int에 대해 이야기 했으므로 지금은 char 또는 1 바이트 (8 비트)에 대해 논의 중이라고 생각해보십시오. 우리가 여전히 같은 값인 65 또는 0x41 또는 'A'를 가지고 있다고 가정 해 봅시다. 이 값을 파일로 보내려면 원시 형식으로 보내거나 텍스트 형식으로 변환 할 수 있습니다. 원시 형식으로 보내면 파일에서 8 비트 (1 바이트)를 차지합니다. 그러나 텍스트 형식으로 파일에 쓰려면 ASCII로 변환하십시오. 형식을 쓰고 자하는 실제 값 (이 경우 65)에 따라 1, 2 중 하나를 차지합니다 , 또는 3 바이트. 패딩 문자가없는 10 진수 ASCII로 쓰고 싶다고합시다. 값 65는 2 바이트를 취합니다. 하나는 '6'이고 다른 하나는 '5'입니다. 16 진수 형식으로 인쇄하려면 '0x'로 시작하지 않는 한 '4'와 '1'에 대해 하나씩 2 바이트를 취합니다.이 경우 4 바이트를 취합니다 '0', 'x', '4'및 '1'에 대한 값입니다. char 값이 255 (최대 값은 char)라고 가정합니다. 10 진수 ASCII 형식으로 파일에 쓰면 3 바이트가 소요됩니다. 그러나 같은 값을 16 진수 ASCII 형식으로 작성하면 16 진수 255의 값이 0xFF이기 때문에 여전히 2 바이트 (또는 "0x"를 앞에두면 4)를 사용합니다. 이것을 기본 이진 형식의 8 비트 바이트 (char)로 작성하는 것과 비교하십시오. char은 정의에 따라 1 바이트를 차지하므로 값이 무엇이든 관계없이 이진 형식의 파일은 1 바이트 만 사용합니다.

+0

정보를 주셔서 감사합니다. 그러나 배열의 [width] [height]에 이미지의 RGB 정보를 채우려면 배열을 올바르게 채울 수 있도록 읽을 수있는 형식으로 변환 할 필요가 없습니까? 또는 이러한 작업에 0-1로 작업해야합니까? 나는 이진 값을 char (0-255 범위)로 변환해야 할 것 같아요. – Danicco

+0

예, 바이너리 파일로 작성하는 이점을 이해했습니다. 대단히 감사합니다! 제가 검색 한 대부분의 장소에서이 같은 정의가 나에게 주어졌지만 공간 절약이라는 이점을 이해할 수 없었습니다. – Danicco

+0

@Danicco - "절약 공간"문제는 아니지만, "변환을 수행 할 필요가 없습니다"문제이므로 이점은 있습니다. 또한 파일에 비트 맵을 저장하는 경우 프로그램에서 실제 .bmp 형식으로 비트 맵을 쓰고 읽으므로 이미지 등을 쉽게 바꿀 수 있습니다. 여러 가지 잡티를 버리면 그러나 하나의 파일에서, 그것은 분명히 중요하지 않습니다. – phonetagger

관련 문제