如何在Dafny中将值转换为两个字节?

时间:2018-12-12 13:49:17

标签: 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];
}

1 个答案:

答案 0 :(得分:0)

要完成示例,您需要更强的循环不变性。但是您根本不需要循环,因为没有理由只将其除以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;
}

这里是相同的程序,但是bytenewtype

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;
}

Rustan