首页 > 解决方案 > 如何转换从管道接收到的二进制数

问题描述

我有一个包含一系列数字的管道。我会阅读它,并且在每次迭代中,我都会将读取的内容写入一个 txt 文件。如何将二进制数转换为十进制数并将它们记录在我的 txt 文件中,每行一个?

PS 管道是在另一个文件中创建的,并且使用以下命令写入数字:

write (fp, &mynum, sizeof (mynum));

主文件

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#define MAX_BUF 1024


int main()
{

    int fd, fp ; 
    int bytesread;
    char * myfifo = "myfifo";
    char buf[MAX_BUF];
    int count = 0; 
    char *filename = "memorizza.txt"; 
    fp = open(filename,O_WRONLY | O_APPEND);
  
    if ((fd = open(myfifo, O_RDONLY))==-1 ){   // opening pipe

        perror(myfifo);
        return 1; 
    }
 
    while(1)
    {
        if((bytesread = read( fd, buf, MAX_BUF - 1)) > 0) //read pipe
        {
            buf[bytesread] = '\0';
       
            count++; 
            write(fp , buf , MAX_BUF ); 
       
        }
        else {

            printf("Ho ricevuto %d numeri primi \n" , count); 
            break;
        }
    }
    close(fd);
    close(fp);
    return 0;
}

标签: cpipewrite

解决方案


要从文件描述符中读取二进制编码的 int (假设主机字节顺序),您必须将 a 指针传递给intto read,并准确读取sizeof(int)字节。一个简单的实现应该是这样的:

int i;
ssize_t e = read(fd, &i, sizeof(i));

这个实现的问题是 read 不能保证一次性给你所有你要求的字节。所以我们必须继续阅读,直到我们有所有的字节:

int i;
char *buffer = (char *)&i;
size_t left_to_read = sizeof(i);

while (left_to_read)
  {
     ssize_t e = read(fd, buffer, left_to_read);
     if (e < 0 && errno != EINTR)
       {
          perror("Failure reading from file descriptor");
          exit(EXIT_FAILURE);
       }
     else if (e == 0)
       {
          /* 
             Handle EOF
          */  
       }
     else if (e > 0)
       {
         left_to_read -= e;
         buffer += e;
       }
   }

编辑:

阅读后自然int可以正常方式转换为ascii:

fprintf(outfile, "%d\n", i);        

推荐阅读