gpt4 book ai didi

c - 使用 write() 系统调用输出 char 数组缓冲区的十进制/十六进制值

转载 作者:行者123 更新时间:2023-11-30 15:30:11 25 4
gpt4 key购买 nike

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 (如注释掉的部分所示),但如果我们不使用任何高级(高于系统)函数,我们可以获得额外的积分。我尝试了多种方法来操作循环中的字符数组,但似乎无论我如何尝试添加或转换字符,它们都会以字符的形式出现。

这并不奇怪,因为我知道字符(至少在 C 中)在技术上是整数。我不知道如何使用 write() 打印 char 的十六进制/十进制值,并且尚未在堆栈上看到任何不默认为 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,即 ASCII 和十六进制值。

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

关于c - 使用 write() 系统调用输出 char 数组缓冲区的十进制/十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com