c - 如何转换从管道接收到的二进制数
问题描述
我有一个包含一系列数字的管道。我会阅读它,并且在每次迭代中,我都会将读取的内容写入一个 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;
}
解决方案
要从文件描述符中读取二进制编码的 int (假设主机字节顺序),您必须将 a 指针传递给int
to 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);
推荐阅读
- python - Python - 过滤列表中对象的引用
- javascript - 分配中的左侧无效:未捕获的 ReferenceError:
- c# - c#控制台应用程序光标移动时删除char
- android - 两指触摸板滚动在 Android Studio 上不起作用?
- node.js - 如何创建包含包及其依赖项的 NPM 存储库
- .net-core - 使用 UrlHelper 和新的 uri .net 核心构建链接时崩溃
- javascript - 如何在 ASP.NET Core 请求结束时启动后台作业?
- java - 在 java、int 和 String 中拆分逗号分隔值
- javascript - jquery - 用新的计算字段当前值并将两者相加
- javascript - 用 getDerivedStateFromProps 替换 redux 中的 componentWillReceiveProps 但不触发