dafny - 如何在 Dafny 中将一个值转换为两个字节?
问题描述
我想将一个整数从 0 转换为 65355,为此我需要一个两字节表示。我试图将它除以 2、8 倍,并在余数为 1 时将 2 的幂求和,然后将该整数转换为一个字节,但我遇到了满足字节限制(256)的问题。第二个字节将是第 8 分区的其余部分,我也遇到了将其转换为字节的问题。
以下是我之前描述的函数方法的代码:
method convertBin(i:int) returns (b:seq<byte>)
requires 0<=i<=65535;
{
var b1:=0;
var q:=i;
var j:=0;
while j<8
invariant 0<=j<=8 && (b1 as int)< power(2,j)
decreases 8-j
{
var p:int;
if(q%2==1){
p:=power(2, j);
b1:=b1 + p;
q:=q/2;
}
j:=j+1;
}
b1:=b1 as byte;
b:=[b1]+[q as byte];
}
解决方案
要完成您的示例,您需要更强的循环不变量。但是你根本不需要循环,因为没有理由只除以 2。
这是byte
作为子集类型进行的:
type byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 + b0
{
b1, b0 := i / 256, i % 256;
}
这是相同的程序,但是byte
是newtype
:
newtype byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 as int + b0 as int
{
b1, b0 := (i / 256) as byte, (i % 256) as byte;
}
鲁斯坦
推荐阅读
- python - 如何进行线性回归并获得标准偏差(Python)
- python - 计划一种方法来比较 2 个数据集的趋势
- angular - Angular 中 WebService 上的下拉列表
- javascript - React Router 导航到页面出现在当前页面下方
- sql - 在整个 JSON 列中搜索关键字,但一个键除外
- python - 如何让 python 使用 htlatex 将 tex 文件编译为 html
- javascript - 如何删除/替换 Node16 中的 Unicode 字符
- firebase - 为什么我们在从 Firebase 获取数据时需要转换为 dart 对象?
- c# - 有没有办法将 input type="file" 'HttpPotedFileBase' 的 src 设置为 asp.net mvc 中已上传的图片?
- flutter - 使用 Firebase 时如何解决 Flutter 中已弃用的 API 错误