跳转到内容

Boolset 编码与解码 ​

Boolset 是一种用于表示布尔值集合的编码方式。它将布尔值集合转换为字符串,以便于存储和传输。Cloudreve 的 API 中,Boolset 通常用于权限设置,比如用户组权限、文件权限。

内部表示 ​

BooleanSet 类型本质上是一个字节切片 ([]byte)。在这个切片中,每一个比特位(bit)代表一个布尔值(权限开关)。

  • 第 0 个标志位对应字节切片中第 0 个字节的第 0 个比特位。
  • 第 1 个标志位对应字节切片中第 0 个字节的第 1 个比特位。
  • ...
  • 第 7 个标志位对应字节切片中第 0 个字节的第 7 个比特位。
  • 第 8 个标志位对应字节切片中第 1 个字节的第 0 个比特位。
  • 以此类推...

一个比特位的值为 1 表示对应的标志位为 true(启用),为 0 表示 false(禁用)。

编码过程 ​

  1. 确定最大索引: 找出需要表示的所有标志位中的最大索引 max_n。
  2. 计算字节数: 确定所需的字节数。至少需要 floor(max_n / 8) + 1 个字节来容纳所有标志位。
  3. 初始化字节序列: 创建一个包含所需字节数的字节序列,并将所有字节初始化为 0。
  4. 设置标志位: 对于每一个需要设置为 true 的标志位 n:
    • 定位到字节序列中的第 byte_index = floor(n / 8) 个字节。
    • 计算该字节内的位索引 bit_index = n % 8。
    • 将该字节的第 bit_index 位设置为 1。这通常通过按位或 (Bitwise OR) 操作完成:byte[byte_index] = byte[byte_index] | (1 << bit_index)。
  5. Base64 编码: 将最终的字节序列编码为 Base64 字符串。

解码过程 ​

  1. Base64 解码: 首先将 Base64 字符串解码为原始的字节序列。
  2. 检查标志位: 要检查特定标志位 n 的状态(是 true 还是 false):
    • 计算字节索引 byte_index = floor(n / 8)。
    • 边界检查: 检查 byte_index 是否在字节序列的有效范围内。如果超出范围,则该标志位隐式为 false(因为它从未被设置过)。
    • 如果 byte_index 有效,则定位到字节序列中的第 byte_index 个字节。
    • 计算位索引 bit_index = n % 8。
    • 检查该字节的第 bit_index 位的值。这通常通过按位与 (Bitwise AND) 操作完成:is_set = (byte[byte_index] & (1 << bit_index)) != 0。
    • 如果结果非零,则标志位 n 为 true;否则为 false。

编程语言实现 ​

Golang ​

boolset.go

go
// 从字符串加载
bs, err := boolset.FromString("/f8B")
if err != nil {
	return nil, err
}

// 读取第 5 个标志位
fmt.Println(bs.Enabled(5))

// 设置第 1 个标志位
boolset.Set(1, true, bs)

// 保存到字符串
encoded, err := bs.String()
if err != nil {
	return nil, err
}

TypeScript ​

boolset.ts

typescript
// 从字符串加载
const bs = new Boolset("/f8B");

// 读取第 5 个标志位
console.log(bs.enabled(5));

// 设置第 1 个标志位
bs.set(1, true);

// 保存到字符串
const encoded = bs.toString();

标识位定义 ​

用户组权限 ​

标志位描述
0是否为管理员
1是否为匿名用户组
2是否可以分享文件
3是否可以访问 WebDAV
4是否可以服务端打包下载
5是否可以执行归档压缩任务
6是否可以开启 WebDAV 代理
7是否可以下载他人分享
8是否可以免费下载分享
9是否可以离线下载
10是否可以转移存储策略
11是否使用重定向直链
12是否可以使用高级删除选项
13是否可以选择指定节点处理任务
14是否可以为匿名用户设置更高的分享权限
17是否使用不重复的直链(仅重定向直链开启时有效)。

文件系统能力 ​

标志位描述
0创建文件
1重命名文件或文件夹
2设置权限
3移动到“我的文件”
4移动到分享目录
5移动到回收站
6上传文件
7下载文件
8更新元数据
9列出子项目
10生成缩略图
11复制到“我的文件”
12复制到分享目录
13复制到回收站
14永久删除
15锁定文件或文件夹
16软删除 (移入回收站)
17从回收站恢复
18创建分享
19获取文件或文件夹信息
20版本控制
21挂载存储策略
22转移存储策略
23进入文件夹
24修改属性(如视图设置)

文件权限 ​

标志位描述
0读
1更新
2创建
3删除
| 4分享
| 5列取

节点功能 ​

标志位描述
0预留位,不要使用
1创建压缩文件
2解压缩文件
3离线下载
4转移存储策略

WebDAV 账号设置 ​

标志位描述
0只读
1反向代理