d处理右值和模板的简单方法
原文
我要从大的二进制
读取中解析小字段
,用模板
时无法组合
有些操作.
import std.bitmanip, std.system;
ubyte[8192] data;
ubyte[] temp = data[4..6];
ushort us = temp.read!(ushort, Endian.bigEndian);
//上面工作,下面不行.
//为了可读,内部提供默认字节序.
import std.bitmanip, std.system;
ubyte[8192] data;
ushort us = data[4..6].read!(ushort, Endian.bigEndian);
read()
用来步进
给定缓冲区
.这样下一个read()
操作很方便,因为语义将是"读个ushort
然后读取int"
等.并且read()
会消耗缓冲区.
要按照read()
方式玩,首先想到读
原始数据进存储
并定义区间(下面数据)供read()
消耗.
但是,它需要通过对切片是非常快速
的,例如dropExactly()
来跳过字节:
void main() {
import std.bitmanip, std.system;
ubyte[8192] storage;
auto data = storage[];
import std.range;
data.dropExactly(4);
ushort us = data.read!(ushort, Endian.bigEndian);
// 数据准备好,用下个来读了
}
或者写复制
来取切片
的包装器,这样read()
消费参数
而非右值
.
import std.system;
// 与read()唯一不同,删除了'ref':
auto readFrom(T, Endian endianness = Endian.bigEndian, R)(R range) {
import std.bitmanip;
return range.read!(ushort, endianness);
}
void main() {
import std.bitmanip, std.system;
ubyte[8192] data;
ushort us = data[4..6].readFrom!(ushort, Endian.bigEndian);
}
不错:
auto read(T, Endian E = Endian.bigEndian, R)
(R range) {
import bop = std.bitmanip;
return bop.read!(T, E)(range);
}//仍为读.不用`readFrom`
void main() {
import std.system;
ubyte[8] d = [ 0xFF, 0xFF, 0xFF, 0xFF,
0xAA, 0xAA, 0xFF, 0xFF ];
ushort us = d[4..6].read!ushort;
assert(us == 0xAAAA);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现