gpt4 book ai didi

c - 使用 C 和 Python 在终端中获取随机字符

转载 作者:行者123 更新时间:2023-11-30 20:21:47 26 4
gpt4 key购买 nike

由于某种原因,当我打开一个文件并用 Python 和 C 逐字节读取它并尝试打印结果时,我会得到随机字符/数据的混合。

例如,当我读取 PNG 图像的前 8 个字节时,如下例所示:

/* Test file reading and see if there's random data */

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define PNG_BYTES_TO_CHECK 8

int
main(void)
{
char fname[] = "../images/2.png";

FILE *fp = fopen(fname, "rb");
if (fp == NULL) abort();

char *buffer = (char *)malloc(PNG_BYTES_TO_CHECK);

if (fread(buffer, 1, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK)
abort();

unsigned i;
for (i = 0; i < PNG_BYTES_TO_CHECK; ++i) printf("%x ", buffer[i]);
printf("\n");

free(buffer); fclose(fp);

return 1;
}

我将这些垃圾发送到标准输出:

ffffff89 50 4e 47 d a 1a a

但是当我使用十六进制编辑器打开文件时,字节完全正常(这是一个有效的 PNG 签名):

enter image description here

有什么想法可能会导致这种情况吗?我没有 Python 的示例,但我记得几天前,我在处理字节级文件和打印内容时遇到了重复的繁琐内容。

最佳答案

png spec规定 png 文件应始终以字节137 80 78 71 13 10 26 10 开头。有符号字节的最大值是 127,这意味着第一个字节的值溢出并变为 -119(如果这令人困惑,请查看 the way negative numbers are represented )。然后将其打印为无符号十六进制整数。为此,有符号字节被提升为整数。同样,由于负数的表示方式,值为 -119 的 4 字节整数具有以下二进制表示形式:11111111111111111111111110001001%x无符号十六进制值的格式说明符。因为它认为您给它的值是无符号的,所以它不会将该二进制解释为负数。如果将 11111111111111111111111110001001 转换为十六进制,您会看到它是 ffffff89

tl;dr:该文件没有任何问题。您只是忘记使字节未签名。

关于c - 使用 C 和 Python 在终端中获取随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41406090/

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