繁体   English   中英

使用write()系统调用输出char数组bufffer的dec / hex值

[英]Using write() system call to output dec/hex value of char array bufffer

int fd = open(argv[argc-1], O_RDONLY, 0);
 if (fd >=0) {
   char buff[4096]; //should be better sized based on stat
   ssize_t readBytes;
   int j;

   readBytes = read(fd, buff, 4096);

   char out[4096];
   for (j=0; buff[j] != '\0'; j++) {
     out[j] = buff[j];
     //printf("%d ", out[j]);
   }

   write(STDOUT_FILENO, out, j+1);

   close(fd);
}
 else {
   perror("File not opened.\n");
   exit(errno);
 }

这是文件转储程序的代码。 目的是要有一个文件,并将其内容作为ASCII字符和十六进制/十进制值转储到命令行。 当前代码能够转储ascii值,但不能转储十六进制/十进制。 我们允许使用printf(如注释部分中所示),但是如果我们不使用任何高级(高于系统)功能,我们将获得额外的荣誉。 我已经尝试了多种方法来在循环中操纵char数组,但是无论我如何尝试添加或强制转换它们作​​为char出来的char似乎都没关系。

这并不奇怪,因为我知道char至少在C中是技术上的整数。 我不知道如何使用write()打印char的十六进制/ dec值,并且还没有在堆栈上看到任何未默认为printf()或putchar()的答案

您可以制作一个更大的缓冲区,在其中进行从ASCII到十六进制/十进制的转换(根据需要)并打印新的缓冲区。 我希望这个例子可以说明这个想法:

#include <stdlib.h>
#include <io.h>

int main (int argc, char** argv)
{
    const char* pHexLookup = "0123456789abcdef";
    char pBuffer[] = {'a', 'b', 'c'}; // Assume buffer is the contents of the file you have already read in
    size_t nInputSize = sizeof(pBuffer); // You will set this according to how much your input read in
    char* pOutputBuffer = (char*)malloc(nInputSize * 3); // This should be sufficient for hex, since it takes max 2 symbols, for decimal you should multiply by 4
    for (size_t nByte = 0; nByte < nInputSize; ++nByte)
    {
        pOutputBuffer[3 * nByte] = pBuffer[nByte];
        pOutputBuffer[3 * nByte + 1] = pHexLookup[pBuffer[nByte] / 16];
        pOutputBuffer[3 * nByte + 2] = pHexLookup[pBuffer[nByte] % 16];
    }
    write(1 /*STDOUT_FILENO*/, pOutputBuffer, nInputSize * 3);
    free(pOutputBuffer);
    return EXIT_SUCCESS;
}

这将a61b62c63打印a61b62c63 ,ASCII和十六进制值。

这是在Windows上完成的,因此不要尝试直接复制它,我试图坚持POSIX系统调用。 通常,对于十六进制,您分配的内存块是原始内存块的3倍(如果需要在输出中加空格,则分配更大的内存块),并在其旁边放置一个与该字节的十六进制值相对应的ASCII符号。 对于十进制,您将需要更多空间,因为该值可以跨越3个字符。 然后只需编写新的缓冲区。 希望这足够清楚。

怎么样:

unsigned char val;
val = *out / 100 + 48;
write(STDOUT_FILENO, &val, 1);
val = (*out - *out / 100 * 100 ) / 10 + 48;
write(STDOUT_FILENO, &val, 1);
val = (*out - *out / 10 * 10) + 48;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM