|
아무래도, 저장때 사용하신 메소드가 잘못되었거나, 아니면 제가 생각하고 있는 ASCII와
HEX 개념이 준원님과 달라서 착오를 일으키는것 같습니다.
우선 아래 두가지 방법의 예시를 보시고 원하시는 방법이 있으신지 찾아보기시 바랍니다.
첫번째 함수 (Button1Click)는, 준원님 말씀대로 0, 1 을 넣으면 Hex 코드로 0, 1 을 넣는
코드입니다. 실질적으로 Hex 값이 01, 01 로 출력됩니다.
두번째 함수 (Button2Click)는, 9를 입력하면 나오는 2진수 값이 1001 인데, 이것을 맵핑시켜서
Hex 코드로 10, 01 을 넣는 예제입니다.
또한, char 형이나 int 형등을 그냥 저장시키면 자동으로 Hex 값으로 바뀌어 저장됩니다.
(단, CPU에 따라서 저장 순서는 바뀝니다. IBM계열은 뒤쪽에서 앞쪽으로 변환되고 홀수로
남은 자리수는 0으로 채웁니다)
cuperido
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *fiHandle;
char temp[2];
temp[0] = 1;
temp[1] = 2;
fiHandle = fopen("C:\\DOWNLOAD\\TEST.DAT", "wb");
fputc(temp[0], fiHandle);
fputc(temp[1], fiHandle);
fclose(fiHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
unsigned char chTest, chHiBit, chLowBit;
char caBin[10];
FILE *fiHandle;
int itCount;
chTest = 9;
ultoa(chTest, caBin, 2);
// 홀수로 끝나면 앞에 0을 붙여 짝수로 채워줌
if(strlen(caBin) % 2) {
memcpy(&caBin[1], caBin, strlen(caBin) + 1);
caBin[0] = '0';
}
fiHandle = fopen("C:\\DOWNLOAD\\TEST.DAT", "wb");
for(itCount = 0; itCount < strlen(caBin); itCount += 2) {
chHiBit = caBin[itCount] == '1' ? 1 : 0;
chLowBit = caBin[itCount + 1] == '1' ? 1 : 0;
fputc((chHiBit << 4) + chLowBit, fiHandle);
}
fclose(fiHandle);
}
//---------------------------------------------------------------------------
김준원 님이 쓰신 글 :
: 흠... 만약에 문자배열에 char 타입의 변수에 수치를 넣어줘서 저장이 된다면 그것을 그냥 그대로 쓰는것도 가능하지만....
:
: 문제는 이겁니다...
:
: char temp[2];
:
: temp[0] = 1;
: temp[1] = 2;
:
: 이라고 한 뒤에
: 이것을 저장하면 말 그대로
:
: 헥사 에디터 같은 툴을 이용하여 내부 파일에 값을 보면
:
: 01 02 가 나와야 정상인데.....
:
: 어떤 이유에서인지 Borland 쪽에서는
: 1과 2 를 바로 char 타입의 글자 1 2 로 처리를 해버리더군요....
:
: 이 부분에서의 문제는 어떻게 해결을 해야되는가요???
:
: 값의 지정이야 바이너리값을 넣어주면... 연산을 통해서 8 비트 단위로 쪼개주면 잘 들어가겟지만....
:
: 이상하게 ㅡㅡ;;; 1 같은 숫자를 수치로 먹지 않고 글자로 먹어버리는 난감한 상황에 어찌 프로그래밍 해야 될지 잘 모르겟습니다.
:
: 이런 저런것 답변 매우 감사드리며 이번 것도 답변 주시길 바라는.... -ㅂ-)b
:
:
:
:
: 유영인 Cuperido 님이 쓰신 글 :
: : 약간은 어쩌면 비트 연산과 파일 입출력에 관한 이슈는 서로 개별적인 사항입니다.
: :
: : bitset은 비트 연산에 관한 템플릿으로 기본적으로 빌더 내에서도 제공하고 있지만,
: : 이 사항이 파일 입출력과 직접 연관이 있다고 보기에는 힘듭니다.
: :
: : 만약, 준원님께서 원하시는 대로 파일을 비트대로 읽고 쓰는 루틴을 물론, 구현을 할수는
: : 있을 것입니다. (전에 말씀드린 방법대로)
: :
: : 하지만, 이것은 퍼포먼스를 상당히 떨어트리는 구조가 되겠지요. 제가 이제까지 경험한 바로는
: : IBM-PC상에서는 파일 입출력을 Bit단위로 하지는 않습니다.
: :
: : 따라서, 다시 제안을 드리자면, 비트 단위는 메모리에서 처리하시고, 파일 입출력은 바이트
: : 단위로 하셔서 메모리 단에서 적절히 처리하여 퍼포먼스를 높이는 방법을 택하시는 것이
: : 가장 효율적일것 같다. 라는 말씀입니다. :)
: :
: :
: : cuperido
: :
: :
: :
: : 김준원 님이 쓰신 글 :
: : : 이런 저런것들에 대해서 알아보니... bitset 이라는 것이 있더군요!
: : :
: : : 혹시 이것에 대해서 아시는지요???
: : :
: : : bitset은 형태가 어찌 다른건지요??? 내부 데이터의 접근과 파일로의 저장은 어떤 식으로 해야되는지요?
: : :
: : : 유영인 Cuperido 님이 쓰신 글 :
: : : : 파일 입 출력은 무조건 Byte 단위로 이루어집니다.
: : : : Bit 단위로 입출력을 하는 것은 현재 바이트를 읽어서 비트 연산을 한후 다시
: : : : 그 연산된 바이트를 기록 하는 방법밖에는 없습니다
: : : :
: : : : 압축 프로그램등이 비트 단위로 연산이 이루어지는데, 이 역시 바이트 단위로
: : : : 쭉 읽어들인다음 비트 연산을 다시 하는 방법을 사용하고 있습니다.
: : : :
: : : :
: : : : cuperido
: : : :
: : : : 김준원 님이 쓰신 글 :
: : : : : 바이너리 입력과 출력에서!!! 진짜 원시적인 입출력을!!!
: : : : :
: : : : : 무슨 소리냐? 하시는 분 계실지 모르겟습니다...
: : : : :
: : : : : 흔히들 데이터 저장을 바이너리로 저장할때
: : : : :
: : : : : Char 사이즈 즉 8Bit 단위로들 저장을 하시거나 읽어오시는 경우가 있지 않습니까????
: : : : :
: : : : : 어디한번
: : : : :
: : : : : 진짜 무식하게
: : : : :
: : : : : 1bit 단위!!!
: : : : :
: : : : : 바이트 단위로!!!
: : : : :
: : : : : True False 단위로!!!
: : : : :
: : : : : 파일 읽기와 저장을 해보고 싶은데...
: : : : :
: : : : : OpenDialog 와 SaveDialog 를 이용하여 작업을 하려면 어찌 해야되는건가요????
: : : : :
: : : : : 이런 경우에 대해서 혹시 생각해보신분 계신가요???
|