gpt4 book ai didi

c - C 中文件的二进制/整数表示

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

我正在尝试将一些简单的 Ruby 代码移植到 C 语言以提高速度,但我实际上无法实现这一目标,因为 C 不是我的主要语言,而且我正在努力理解造成这种情况的原因。为了清楚起见,下面是 Ruby 代码:

source_file = open("/tmp/image.jpg")
content = source_file.read
content_binary_string = content.unpack("b*")[0]
content_integer = content_binary_string.to_i(2)

然后,我在 C 中尝试了几次以获得相同的结果,但不知怎的,我陷入了 Ruby 和 C 输出之间的二进制比较。这是我到目前为止得到的 C 代码:

// gcc -Wall -Wextra -std=c99 xxd.c
#include <stdio.h>
#include <string.h>

int main() {
char buffer[32];
FILE *image;
image = fopen("/tmp/image.jpg","rb");
while (!feof(image)) {
fread(buffer, sizeof(buffer), 1, image);
const size_t len = strlen(buffer);
for (size_t j = 0; j < len; j++ ) {
for (int i = 7; i >= 0; i--) {
printf(buffer[j] & (1 << i) ? "1" : "0");
}
}
}
return 0;
}

请注意,C 代码尚未完成,我现在正在打印二进制值,以便我可以将输出与当前工作代码进行比较,并且我相信我缺少一些由 Ruby 抽象的基本概念,例如字节大小或其他对我来说还不太明显的东西。此时的输出完全不同。

正确执行该步骤后,目标是从中生成一个基于整数的值。

非常感谢任何有助于理解输出不准确原因的线索!

最佳答案

  1. feof()应该在输入函数指示读取失败之后使用。它区分失败是否是由于文件结束造成的。

  2. strlen()报告字符串长度(不包括空字符)。在 C 中,字符串是直到并包括空字符的字符序列。不要使用它来确定缓冲区中有多少字节。使用fread()的返回值。 @subin

  3. 检查输入函数的返回值。 @user694733

  4. 避免使用非格式字符串作为 printf() 的第一个参数.

  5. 更好地使用unsigned喜欢 1u位运算。

  6. 次要:避免像 7 这样的魔数(Magic Number)。CHAR_BIT可用于<limit.h> .

  7. 次要:使用 fclose()玩完后把玩具收起来。

<小时/>
  image = fopen("/tmp/image.jpg","rb");
if (image == NULL) Handle_OpenFailure();

size_t count;
while ((count = fread(buffer, sizeof buffer[0], sizeof buffer, image)) > 0) {
for (size_t j = 0; j < count; j++ ) {
for (int i = CHAR_BIT-1; i >= 0; i--) {
fputc(buffer[j] & (1u << i) ? '1' : '0', stdout);
}
}
}
fclose(image);

关于c - C 中文件的二进制/整数表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907098/

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