gpt4 book ai didi

c - 有没有更好的方法将十六进制打印到文件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:47 27 4
gpt4 key购买 nike

我正在尝试将二进制格式转换为十六进制格式,二进制数据每秒都有一个流,我的代码如下:

for(int i = 0; i < strlen(s); i++)
{
sprintf(in+i*2, "%02x", s[i]);
}
fprintf(fp, "%s\n", in);

但是它太慢了,因为数据进来的太快了。

有没有更好的处理方式?

有没有fnprintf(fp, size, "%.*02x\n", num, in)之类的函数?

最佳答案

第一个问题是您在循环的每一次通过时都调用 strlen。请注意,strlen 必须计算字节数,直到找到字符串的末尾。如果您的字符串有 100 个字节长,那么循环将调用 strlen 100 次,每次 strlen 都将计数到 100 个字节。结果是 strlen 将在循环结束前计算出总共 10000 个字节。

第二个问题是您在每次通过循环时都调用 sprintfprintf 家族的所有成员都是相当重量级的函数,在高性能代码中应该避免使用。鉴于将一个字节转换为两位十六进制数很容易,您实际上并不需要 sprintf

如果您消除了 strlensprintf,这就是代码的样子。 (我还通过检查输出缓冲区溢出来增加一些安全性。这就是 bend 的用途。)

#define BUFSIZE 200

int digit;
char *sptr, *bptr, *bend;
char string[BUFSIZE];
char buffer[BUFSIZE];

bptr = buffer;
bend = &buffer[BUFSIZE - 2];
for ( sptr = string; *sptr != '\0'; sptr++ )
{
digit = (*sptr >> 4) & 0xf;
*bptr++ = ( digit > 9 ) ? digit + 'a' - 10 : digit + '0';

digit = *sptr & 0xf;
*bptr++ = ( digit > 9 ) ? digit + 'a' - 10 : digit + '0';

if ( bptr >= bend )
break;
}
*bptr = '\0';

fprintf( fp, "%s\n", buffer );

关于c - 有没有更好的方法将十六进制打印到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24543845/

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