programing

C의 바이너리 파일을 읽고 쓰시겠습니까?

prostudy 2022. 8. 8. 14:58
반응형

C의 바이너리 파일을 읽고 쓰시겠습니까?

바이너리 파일에 쓸 수 있는 코드의 예를 가지고 있는 사람이 있습니까?바이너리 파일을 읽어내 스크린에 출력할 수 있는 코드도 있습니다.예를 들어 파일에 쓸 수 있지만 파일에서 읽으려고 하면 제대로 출력되지 않습니다.

바이너리 파일의 읽기 및 쓰기는 다른 파일과 거의 동일하며, 유일한 차이점은 여는 방법입니다.

unsigned char buffer[10];
FILE *ptr;

ptr = fopen("test.bin","rb");  // r for read, b for binary

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer

읽을 수 있다고 하셨는데, 제대로 출력되지 않습니다.이 데이터를 "출력"할 때 ASCII를 읽지 않으므로 화면에 문자열을 인쇄하는 것과 같지 않습니다.

for(int i = 0; i<10; i++)
    printf("%u ", buffer[i]); // prints a series of bytes

파일에 쓰는 방법은 거의 비슷하지만 다음 대신 사용하는 경우는 예외입니다.

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer

Linux 얘 linux linux linux linux..설치하다hexdump하고 파일을

mike@mike-VirtualBox:~/C$ hexdump test.bin
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
...

이것을 출력과 비교합니다.

mike@mike-VirtualBox:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0

ㅇㅇ, ㅇㅇㅇ를 ...printf a까지%x 알기 쉽게 위해: to to to to to to to to to to:

mike@mike-VirtualBox:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0

이봐, 봐!이제 데이터가* 일치합니다.대박이다. 바이너리 파일을 제대로 읽고 있나 봐!

* 바이트는 출력으로 스왑되지만 데이터는 정확합니다.이것에 맞추어 조정할 수 있습니다.

"make a weak pin 스토리지 program" 솔루션에 매우 만족하고 있습니다.매우 간단한 바이너리 파일 IO 예가 필요한 사용자에게 도움이 될 수 있습니다.

$ ls
WeakPin  my_pin_code.pin  weak_pin.c
$ ./WeakPin
Pin: 45 47 49 32
$ ./WeakPin 8 2
$ Need 4 ints to write a new pin!
$./WeakPin 8 2 99 49
Pin saved.
$ ./WeakPin
Pin: 8 2 99 49
$
$ cat weak_pin.c
// a program to save and read 4-digit pin codes in binary format

#include <stdio.h>
#include <stdlib.h>

#define PIN_FILE "my_pin_code.pin"

typedef struct { unsigned short a, b, c, d; } PinCode;


int main(int argc, const char** argv)
{
    if (argc > 1)  // create pin
    {
        if (argc != 5)
        {
            printf("Need 4 ints to write a new pin!\n");
            return -1;
        }
        unsigned short _a = atoi(argv[1]);
        unsigned short _b = atoi(argv[2]);
        unsigned short _c = atoi(argv[3]);
        unsigned short _d = atoi(argv[4]);
        PinCode pc;
        pc.a = _a; pc.b = _b; pc.c = _c; pc.d = _d;
        FILE *f = fopen(PIN_FILE, "wb");  // create and/or overwrite
        if (!f)
        {
            printf("Error in creating file. Aborting.\n");
            return -2;
        }

        // write one PinCode object pc to the file *f
        fwrite(&pc, sizeof(PinCode), 1, f);  

        fclose(f);
        printf("Pin saved.\n");
        return 0;
    }

    // else read existing pin
    FILE *f = fopen(PIN_FILE, "rb");
    if (!f)
    {
        printf("Error in reading file. Abort.\n");
        return -3;
    }
    PinCode pc;
    fread(&pc, sizeof(PinCode), 1, f);
    fclose(f);

    printf("Pin: ");
    printf("%hu ", pc.a);
    printf("%hu ", pc.b);
    printf("%hu ", pc.c);
    printf("%hu\n", pc.d);
    return 0;
}
$

몇 가지 방법이 있습니다. 바이너리를 합니다.open(),read(),write(),close()한 번에 1바이트씩 하는 것과는 완전히 다릅니다.FILE * 변변 file file file file file file file file file file file file file file file file file file file file file file file b b b b b b b b b b b b b b b b b b b * BTW에서 정수 기술자.데이터가 가득 찬 버퍼를 읽으면, 예를 들어 32k바이트를 동시에 읽습니다.버퍼는 메모리에 있기 때문에 매우 빠르게 읽을 수 있는 어레이입니다.또한 한 번에 많은 바이트를 읽고 쓰는 것이 한 번에 1바이트보다 빠릅니다.Pascal은 읽기()를 합니다.

찾아봤는데, 수중에 예시가 없어요.JPEG 이미지로도 작업을 하기 때문에 이상적이지 않습니다.여기 읽어주세요.아마 open()에서 close(fbuf) 부분만 신경 쓰실 겁니다.fbuf는 읽을 배열입니다.sb.st_size는 stat() 호출로부터의 파일사이즈입니다.

    fd = open(MASKFNAME,O_RDONLY);
    if (fd != -1) {
      read(fd,fbuf,sb.st_size);
      close(fd);
      splitmask(fbuf,(uint32_t)sb.st_size); // look at lines, etc
      have_mask = 1;
    }

(여기서 pix는 바이트 배열, jwidth 및 jheight는 JPEG 폭 및 높이이므로 RGB 색상의 경우 높이 * 폭 * 3 색 바이트로 씁니다.)쓸 바이트 수입니다.

void simpdump(uint8_t *pix, char *nm) { // makes a raw aka .data file
  int sdfd;
  sdfd = open(nm,O_WRONLY | O_CREAT);
  if (sdfd == -1) {
    printf("bad open\n");
    exit(-1);
  }
  printf("width: %i height: %i\n",jwidth,jheight);  // to the console
  write(sdfd,pix,(jwidth*jheight*3));
  close(sdfd);
}

남자 2가 열려있고, 읽고, 쓰고, 닫는 걸 봐.또, 이 오래된 스타일의 jpeg example.c:https://github.com/LuaDist/libjpeg/blob/master/example.c 여기서 전체 이미지를 읽고 씁니다.그러나 바이트의 바이너리 읽기 및 쓰기는 한 번에 많은 양입니다.

"하지만 파일에서 읽으려고 하면 제대로 출력되지 않습니다."음. 숫자 65를 읽으면 A의 ASCII가 됩니다.아마 당신도 남자아스키를 봐야 할 것 같아요.1을 원하시면 ASCII 0x31이 됩니다.char 변수는 매우 작은 8비트 정수입니다. printf를 %i로 하면 ASCII 값을 얻을 수 있고, %c를 하면 문자를 얻을 수 있습니다.16진수일 경우 %x를 수행합니다.모두 0에서 255 사이의 동일한 번호입니다.

이것은 바이너리 jpg 또는 wmv 비디오 파일을 읽고 쓰는 예입니다.파일 *fout; 파일 *fin;

Int ch;
char *s;
fin=fopen("D:\\pic.jpg","rb");
if(fin==NULL)
     {  printf("\n Unable to open the file ");
         exit(1);
      }

 fout=fopen("D:\\ newpic.jpg","wb");
 ch=fgetc(fin);
       while (ch!=EOF)
             { 
                  s=(char *)ch;
                  printf("%c",s);
                 ch=fgetc (fin):
                 fputc(s,fout);
                 s++;
              }

        printf("data read and copied");
        fclose(fin);
        fclose(fout);

16진수 에디터에서 볼 수 있는 것과 같은 16진수 값을 출력하는 C++의 바이트 배열에 바이너리 파일을 읽는 방법을 찾느라 정말 고생했습니다.많은 시행착오 끝에, 이것이 추가 캐스팅 없이 그렇게 할 수 있는 가장 빠른 방법인 것 같다.기본적으로는 파일 전체가 메모리에 로드되지만 처음 1000바이트만 출력됩니다.

string Filename = "BinaryFile.bin";
FILE* pFile;
pFile = fopen(Filename.c_str(), "rb");
fseek(pFile, 0L, SEEK_END);
size_t size = ftell(pFile);
fseek(pFile, 0L, SEEK_SET);
uint8_t* ByteArray;
ByteArray = new uint8_t[size];
if (pFile != NULL)
{
    int counter = 0;
    do {
        ByteArray[counter] = fgetc(pFile);
        counter++;
    } while (counter <= size);
    fclose(pFile);
}
for (size_t i = 0; i < 800; i++) {
    printf("%02X ", ByteArray[i]);
}

질문은 C에 바이너리 데이터 파일을 작성하고 CAMILO HG의 Gnuplot을 사용하여 플롯하는 방법과 관련되어 있습니다.나는 진짜 문제가 1) 바이너리 데이터 파일 쓰기 2) Gnuplot을 사용하여 플롯하기 두 부분으로 이루어진다는 것을 알고 있다.

첫 번째 부분은 매우 명확하게 답변이 되어 있기 때문에 덧붙일 것은 없습니다.

두 번째 방법은 Gnuplot 매뉴얼로 사람을 보내는 것입니다.누군가 좋은 답을 찾을 수 있다고 확신하지만 웹에서는 찾을 수 없기 때문에 하나의 해결책을 설명하겠습니다(실제 질문에는 반드시 있어야 하지만 스택 오버플로우는 처음이라 답변할 수 없습니다).

데이터 쓴후, 「」를 사용해 바이너리 파일을 합니다.fwrite()에 아주, 글쓴이는 글쓴이와 같은 구조를 합니다.fread()대신fwrite()따라서 이 프로그램을 쉽게 생성할 수 있습니다.reader.c원본 코드의 쓰기 부분을 파일링하고 읽기를 위해 쓰기를 변경합니다('읽기'의 경우 '읽기').또한 파일의 길이가 올바른 경우 등 데이터에 대한 몇 가지 검사를 포함할 수 있습니다.마지막으로 프로그램은 표준 출력으로 데이터를 인쇄해야 합니다.printf().

확실히 하자면, 프로그램은 다음과 같이 실행된다.

$ ./reader data.dat

X_position Y_position  (it must be a comment for Gnuplot)*

1.23 2.45

2.54 3.12

5.98 9.52

좋아요, 이 프로그램을 사용하면 Gnuplot에서 리더의 표준 출력을 Gnuplot에 파이프로 연결하기만 하면 됩니다. 다음과 같습니다.

plot '< ./reader data.dat'

이 행은 프로그램 리더를 실행하고 출력은 Gnuplot과 연결되어 데이터를 플롯합니다.

*Gnuplot은 프로그램의 출력을 읽기 때문에 Gnuplot이 읽을 수 있는 것과 플롯할 수 없는 것을 알아야 합니다.

언급URL : https://stackoverflow.com/questions/17598572/read-and-write-to-binary-files-in-c

반응형