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);
}
posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示