• 删除数据
  • 添加数据
  • 插入数据
  • 替换数据
  • 整数与二进制数据互转
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <io.h>
typedef unsigned char byte;

long getLength(FILE *stream) {
    return filelength(fileno(stream));
}

bool removeBytes(FILE *stream, int length) {
    if (length <= 0)
        return true;
    long pos1, pos2, oldLength, newLength, off;
    pos1 = pos2 = ftell(stream);
    fseek(stream, 0, 2);
    oldLength = ftell(stream);
    fseek(stream, pos1, 0);
    newLength = oldLength - length;
    off = newLength - pos1;
    while (off > 0) {
        int cSize = off>0x1000?0x1000:off;
        char *cache = new char[cSize];
        off -= cSize;
        if (fseek(stream, pos2 + length, 0) ||
            fread(cache, 1, cSize, stream) != cSize ||
            fseek(stream, pos2, 0) ||
            fwrite(cache, 1, cSize, stream) != cSize)
            return false;
        pos2 += cSize;
        free(cache);
    }
    fseek(stream, pos1, 0);
    return !ftruncate(fileno(stream), newLength<pos1?pos1:newLength);
}

bool addBytes(FILE *stream, int length) {
    if (length <= 0)
        return true;
    long pos, oldLength, newLength, off;
    pos = ftell(stream);
    fseek(stream, 0, 2);
    oldLength = ftell(stream);
    fseek(stream, pos, 0);
    newLength = oldLength + length;
    off = oldLength - pos;
    if (ftruncate(fileno(stream), newLength))
        return false;
    while (off > 0) {
        int cSize = off>0x1000?0x1000:off;
        char *cache = new char[cSize];
        off -= cSize;
        if (fseek(stream, pos + off, 0) ||
            fread(cache, 1, cSize, stream) != cSize ||
            fseek(stream, pos + length + off, 0) ||
            fwrite(cache, 1, cSize, stream) != cSize)
            return false;
        free(cache);
    }
    fseek(stream, pos, 0);
    return true;
}

bool insertBytes(FILE *stream, byte *bytes, long length = 4) {
    if (length <= 0)
        return true;
    return addBytes(stream, length) && fwrite(bytes, 1, length, stream) == length;
}

bool replaceBytes(FILE *stream, long length1, byte *bytes, long length2 = 4) {
    if (length1 < 0 || length2 < 0)
        return true;
    long length;
    bool boolean;
    length = length2 - length1;
    if (length > 0)
        boolean = addBytes(stream, length);
    else if (length < 0)
        boolean = removeBytes(stream, -length);
    return boolean && fwrite(bytes, 1, length2, stream) == length2;
}

template<typename T>
void bytesToNumber(const uint8_t *bytes, T &n, size_t length = sizeof(T)) {
    n = 0;
    if (length > 0) {
        for (int i = 0; i < length; ++i) {
            n |= (bytes[i] & 0xff) << (length - 1 - i) * 8;
        }
    }
}

template<typename T>
void numberToBytes(uint8_t *bytes, T n, size_t length = sizeof(T)) {
    if (bytes == nullptr) {
        return;
    }
    if (length > 0) {
        for (int i = 0; i < length; ++i) {
            *bytes++ = (uint8_t)(n >> (length - 1 - i) * 8 & 0xff);
        }
    }
}

标签: none

已有 4 条评论

  1. 小雷 小雷 访客 Chrome Android 8.1.0 回复

    可以汉化吗

    1. 小さな手は 小さな手は 博主 Chrome Android 8.1.0 回复

      回复 @小雷

      你确定没有走错场子?

      1. ハッハッハ ハッハッハ 访客 Chrome Windows 10 回复

        回复 @小さな手は

        c#的有没有

        1. 小さな手は 小さな手は 博主 Chrome Windows 10 回复

          回复 @ハッハッハ

          木有哦没搞C#

添加新评论

注意:已开启评论过滤器,无中文无法评论!
泡泡表情