【问题标题】:Zero padding: How to remove zeroes from the end of file?零填充:如何从文件末尾删除零?
【发布时间】:2013-12-11 17:55:34
【问题描述】:

我需要用 C 来实现这个方法(https://en.wikipedia.org/wiki/Padding_%28cryptography%29#PKCS7),它没有方便的函数来实现。

我是这样添加的

int main()
{
    FILE *file=fopen("1.xlsx", "a"); 

   file_add(16,file);
   fclose(file);
}
void file_add(int SizeOfBlock, FILE *file )
{
    fseek(file, 0, SEEK_END);
    int size = ftell(file); // file size in bytes
    fseek(file, 0, SEEK_SET);

    int diff = size%SizeOfBlock;

    char arr[16] = "0000000000000000"; //16 zeroes
    fwrite(arr, SizeOfBlock-diff, 1 , file); // here I added to end of file missing 0 to make size of file  be dividing to SizeOfBlock

}


void file_remove (int SizeOfBlock, FILE *file)
{
  // by this function I need to delete these zeroes
  // max amount of zeroes is limited by SizeOfBlock
}

我该怎么做? SizeOfBlock 只能是 8 或 16

【问题讨论】:

  • @Rocketq 他的意思是你的代码正在将可打印字符0(零,ascii 值 48)添加到文件末尾,而不是实际的 NUL 字符。
  • 你想写数字字符的0作为填充吗?
  • @BLUEPIXY 我想是的,为什么不呢?因为毕竟删除这些零并不容易?我在这里描述了为什么我需要这样的代码stackoverflow.com/questions/20504653/…
  • @Rocketq 常量(零)填充仅在您还存储文件的原始长度时才有用。考虑文件内容00填充到00000000,删除填充时应该在文件末尾删除多少个零?
  • 我刚刚预测到了,那个文件最后不会是零了,反正没问题,怎么删除呢?我总是可以修改代码并实现其他填充

标签: c file padding


【解决方案1】:

要截断文件,您可以使用以下函数:

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

由于ftruncate 使用文件描述符,您必须使用filenoFILE 结构中获取该描述符。

ftruncate(fileno(file), length);

如果您指定的新长度比当前文件长,则文件将增长,这可能有点误导,考虑到函数的名称。所以它实际上也可以用来使文件变大,用\0填充它。

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2012-07-02
    相关资源
    最近更新 更多