断点续传----位图

2023-11-19

首先了解什么是位图和他的工作原理。

定义:

位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的。

工作原理:

查找一个数是否存在,其实答案就是存在或者不存在,这种只需要回答是与否的问题,我们都可以用二进制中的位来表示,1表示该数存在,反之0表示该数不存在。位图中的每个数据单元都是一个bit位,这样子平时我们都要话32位4字节来存储数据,而现在我们只需要花1个字节就能“存储数据”,在空间上减少了约32倍的容量。例如40G的数据我们只要花1.3G来存储。但是我们平时操作的数据类型最小就是一个字节,我们不能直接对位进行操作,所以我们可以借助位运算来对数据进行操作。(摘录)

实现:

用基于peer to peer协议的下载系统进行举例子:
定义一个全局变量bitmap指向自己的位图,可以从位图中获知下载的进度,创建下载文件的位图,分配内存并初始化,获取某一位的值,设置某一位的值,将位图所有位全部清零,然后全部设置成1,释放本部分代码中动态分配的内存,将位图存储到文件中,在下次下载时,先读取该文件获取已经下载的进度,断点续传,判断src(源)位图的peer对具有dst(目的)位图的peer是否感兴趣,如果dst(目的)中某位为1而src(源)对应为0,则说明src(源)对dst(目的)感兴趣,如果感兴趣,就获取当前已下载到的总piece数,继续进行下载。

部分代码

//bitfield.h
#ifndef BITFIELD_H
#define BITFIELD_H
 
typedef struct _Bitmap
{
    unsigned char *bitfield;    //保存位图
    int bitfield_length;        //位图所占总字节数
    int valid_length;           //位图有效的总位数,每一位代表一个piece
} Bitmap;
 
int create_bitfield();          //创建位图,分配内存并进行初始化
int get_bit_value(Bitmap *bitmap, int index);//获取某一位的值
int set_bit_value(Bitmap *bitmap, int index, unsigned char value);//设置某一位的值
int all_zero(Bitmap *bitmap);   //全部清零
int all_set(Bitmap *bitmap);    //全部设置为1
void release_memory_in_bitfield();  //释放bitfield.c中动态分配的空间
int printf_bitfield(Bitmap *bitmap);    //打印位图值,用于调试
int restore_bitmap();   //将位图存储到文件中
                //在下次下载时,先读取该文件获取已经下载的进度
int is_interested(Bitmap *dst, Bitmap *src);    //拥有位图src的peer是否对拥有
                                                //dst位图的peer感兴趣
int get_download_piece_num();          //获取当前已下载到的总piece数
#endif // BITFIELD_H

整体代码就不赘述出来了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

断点续传----位图 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 创建类似软键盘的无焦点对话框程序

    如果想创建一个类似windows里的屏幕键盘式的程序 由于需要将模拟键盘的输入发送到原来处于活动状态的程序 因此 我们的程序应该不改变原来的焦点 在vc6和vc 中可以通过以下方式实现 1 VC6 0中 在对话框的OnInitDialog
  • MQ如何保证消息的顺序一致性问题?

    产生原因 MQ服务器集群化或MQ采用分区模型架构来存放消息 每个分区对于一个消费者消费消息 解决消息一致性问题 核心思想 消息一定要投递到同一个MQ 且是同一个分区模型且被用一个消费者消费 可以根据消息key对分区模型总数取余来实现 1 大
  • 【云原生•监控】基于Prometheus的云原生集群监控(理论+实践)-03

    云原生 监控 基于Prometheus的云原生集群监控 理论 实践 03 k8s服务组件指标 kubernetes云原生集群作为大规模多节点容器调度平台 在交付和部署上的巨大优势逐渐让其称为一种技术趋势 如基于工作负载快速进行扩 缩容 故障
  • c++通讯录管理系统

    系统需求 代码 include
  • 7-37 5门课的平均分 7-38 等边三角形面积

    目录 7 37 5门课的平均分 输入格式 输出格式 样例 gt 输入样例 输出样例 思路 代码 7 38 等边三角形面积 输入格式 输出格式 输入样例 输出样例 思路 代码 7 37 5门课的平均分 输入5门课程成绩 整数 求平均分 结果保
  • 安装nextcloud文档

    root nextcloud php v PHP 7 2 24 cli built Oct 22 2019 08 28 36 NTS Copyright c 1997 2018 The PHP Group Zend Engine v3 2
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • 电脑迷你世界,迷你世界电脑版

    游戏介绍 配置要求 操作系统 Windows XP Windows Vista Windows 7 Windows 8 运行环境 无特殊需求 CPU Intel Core2 Duo E4600 2 40Hz AMD Athlon 64 X2
  • 关于element-ui中表单重置不生效的原因,及解决方法

    resetFields这个方法是将表单重置为初始值 也就是说 是将表单中的数据重置为dom节点渲染时的值 而不是重置为空对象 也就是说 当你的表单数据 是在dom节点渲染前被赋值的 那么他的初始值就不为空了 还有就是vue中对象是不能直接赋
  • excalidraw 添加手绘中文字体

    Excalidraw是一个矢量绘图工具 支持在绘图中添加文字 Excalidraw目前支持一些常见的中文字体 例如微软雅黑 宋体等 如果你想添加其他的手绘中文字体 可以按照以下步骤进行操作 打开Excalidraw 选择文字工具 在工具栏中
  • 使用python中的SVM进行数据回归预测

    在Python中使用支持向量机 SVM 进行数据回归预测 你可以遵循以下步骤 导入必要的库 from sklearn svm import SVR from sklearn model selection import train test
  • 【数据分析】业务指标的几个相关思考

    业务指标的几个相关思考 1 如何理解数据 拿到数据后 第一步 弄清楚数据里每一列的含义 第二步 对数据进行分类 有助于后期的分析 通常将数据分为 用户数据 行为数据 产品数据 三类 用户数据 指的是用户的基本情况 包括姓名 性别 邮箱 年龄
  • linux下查看redis是否正常运行 和设置密码

    一 查找redis conf文件 我们服务器已经安装了redis 现在通过命令查看下redis的进程 root lnp ps aux grep redis root 7374 0 0 0 0 145312 7524 Ssl 16 37 0
  • Error:(28, 8) java: 类Demo01Array是公共的, 应在名为 Demo01Array.java 的文件中声明

    public 修饰的class类必须与 Java文件名一致 若声明的class非public则文件名无需与类名相同 必须一致
  • Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play

    Android原生系统真的那么好用吗 这种问题当然是否定的 原生 Android 指的是直接基于 AOSP 构建的而非手机厂商出厂固件修改的第三方 ROM 但包括 Nexus Pixel 或其它被 Google 直接支持的手机的可能是闭源的
  • 你们所不了解的程序员思维黑洞

    如果你也是程序员 看看你中了几条 1 数数会从 0 开始数起 比如 程序员吵架的时候会说 我数三下 你再不闭嘴 我就不客气了 零 一 二 或者 在列清单的时候 编号会从 0 开始写 为什么会这样 因为 0 是数组的第一个元素 在经过无数次的
  • 1分钟部署自己的AutoGPT

    4 月初 AutoGPT 引发热潮 短短一个多月 它已经在全球最大的开源软件社区 Github 上累积了131 000颗星 其热度依然持续上升 我体验后发现 虽然基于 3 5 模型的 AutoGPT 还无法最终生成完整的报告 但是它确实可以
  • MySQL高级学习笔记(一)

    文章目录 MySQL高级学习笔记 一 1 索引 1 1索引概述 1 2索引优势劣势 1 3索引结构 1 3 1BTREE 结构 1 3 2B TREE 结构 1 3 3MySQL中的B Tree 1 4索引分类 1 5索引语法 1 5 1
  • agplv3_我是否需要根据AGPLv3许可证提供对源代码的访问?

    agplv3 GNU Affero通用公共许可证版本3 AGPLv3 是与GPLv3几乎相同的copyleft许可证 两种许可证具有相同的版权保留范围 但在一个重要方面存在实质性差异 AGPLv3的第13节规定了GPLv2或GPLv3中不存
  • 断点续传----位图

    首先了解什么是位图和他的工作原理 定义 位图就是bitmap的缩写 所谓bitmap 就是用每一位来存放某种状态 适用于大规模数据 该数据都是不重复的简单数据 通常是用来判断某个数据存不存在的 工作原理 查找一个数是否存在 其实答案就是存在