[英]hex file reading in xv6
我正在尝试将此 xv6 c 文件修改为十六进制查看器。 我尝试使用 printf(%02X) 但无济于事。 我尝试对 printf(%02X) 进行不同的放置组合,但它要么不打印十六进制,要么只在文件视图末尾打印“%02X”。 对于 printf 功能,它指定这些输入 arguments:打印到给定的 fd。 只理解 %d、%x、%p、%s。 void printf(int fd, const char *fmt, ...)
这是我正在使用的代码:
#include "types.h"
#include "stat.h"
#include "user.h"
char buf[512];
void
hex(int fd)
{
int n;
while((n = read(fd, buf, sizeof(buf))) > 0) {
if (write(1, buf, n) != n) {
printf(1, "hex: write error\n");
exit();
}
printf(n,"%02X");
}
if(n < 0){
printf(1, "hex: read error\n");
exit();
}
}
int
main(int argc, char *argv[])
{
int fd, i;
if(argc <= 1){
hex(0);
exit();
}
for(i = 1; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf(1, "hex: cannot open\n", argv[i]);
exit();
}
hex(fd);
close(fd);
}
exit();
}
正如您发现的那样,在 xv6 中, printf
非常有限,您不能使用%02x
修饰符。 您必须将自己限制在%x
(或者您可以扩展printf
function,但这是一项超出要求的练习。
对于每个字符,您必须调用printf(1, "%x ", the_character);
对于0x10
到0xFF
的字符,它将打印两个字符,对于0x10
以下的字符,您必须添加额外的0
。
-- 要逐个字符打印,您需要在read
调用后获得的缓冲区上进行for
循环。 添加一些空间和 LF 以提高可见性,您就完成了。
void hex(int fd)
{
char buf[16];
int n, i;
while((n = read(fd, buf, sizeof(buf))) > 0) {
for (i = 0; i < n; ++i) {
if (buf[i] < 0x10) {
printf(1, "0");
}
printf(1,"%x ", buf[i]);
}
printf(1, "\n");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.