设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2863|回复: 2
收起左侧

[PHP/ASP/JSP] 64位PHP7实现Union结构联合体类模块(非数组,支持大小端/8/16/32/64位数值读写) V1.0

[复制链接]
发表于 2019-4-13 08:54:26 | 显示全部楼层 |阅读模式
本帖最后由 QAQ 于 2019-4-13 08:54 编辑




  1. <?php
  2. /*
  3. 本程序仅限64位PHP7以上版本使用,不支持32位
  4. 8位地址:0~7 16位地址:0~3 32位地址:0~1 64位无地址
  5. 8~32位值范围:0~ 2的位数次方-1
  6. 64位值范围:PHP_INT_MIN ~ PHP_INT_MAX
  7. */

  8. class union64{                //64位联合体(8字节)
  9.         var $value = array(0,0,0,0,0,0,0,0);
  10.         var $bas = 0;
  11.         //Union读数值程序 参数a:地址 (64位无地址)
  12.         function r8($a){        
  13.                 $a &=7;
  14.                 $a = $this->bas ? $a : $a^7;
  15.                 return $this->value[$a];
  16.         }

  17.         function r16($a){
  18.                 $a &=3;
  19.                 $h = $a << 1;
  20.                 $l = $h + 1;
  21.                 $r = 0;
  22.                 $r = $this->r8($h)<<8;
  23.                 $r |= $this->r8($l);
  24.                 return $r;
  25.         }
  26.         
  27.         function r32($a){
  28.                 $a &=1;
  29.                 $h = $a << 1;
  30.                 $l = $h + 1;
  31.                 $r = 0;
  32.                 $r = $this->r16($h)<<16;
  33.                 $r |= $this->r16($l);
  34.                 return $r;

  35.         }

  36.         function r64(){
  37.                 $r = $this->r32(0)<<32;
  38.                 $r |= $this->r32(1);
  39.                 return $r;
  40.         }
  41.         //Union写数值程序 参数a:地址 参数b:数值 (64位无地址)
  42.         function w8($a,$v){
  43.                 $a &=7;
  44.                 $a = $this->bas ? $a : $a^7;
  45.                 $v &=255;
  46.                 $this->value[$a] = $v;
  47.         }

  48.         function w16($a,$v){
  49.                 $a &=3;
  50.                 $v &=65535;
  51.                 $h = $a << 1;
  52.                 $l = $h + 1;
  53.                 $this->w8($h,$v>>8);
  54.                 $this->w8($l,$v);
  55.         }

  56.         function w32($a,$v){
  57.                 $a &= 1;
  58.                 $v &= 4294967295;
  59.                 $h = $a << 1;
  60.                 $l = $h + 1;
  61.                 $this->w16($h,$v>>16);
  62.                 $this->w16($l,$v);

  63.         }

  64.         function w64($v){
  65.                 $this->w32(0,$v>>32);
  66.                 $this->w32(1,$v);

  67.         }

  68.         function in($data){        //导入数据(固定8字节,成功返回1失败返回0)
  69.                 if(strlen($data) != 8) return 0;
  70.                 for($i=0;$i<8;$i++){
  71.                 $this->value[$i] = ord($data[$i]);
  72.                 }
  73.                 return 1;
  74.         }

  75.         function out(){                //导出数据(8字节)
  76.                 $return = null;
  77.                 for($i=0;$i<8;$i++){
  78.                 $return .= chr($this->value[$i]);
  79.                 }
  80.                 return $return;
  81.         }

  82.         function sbas($bas){                //设置大小端 0小端 1大端
  83.                 $this->bas = $bas&1;
  84.         }

  85.         function gbas(){                //读取大小端
  86.                 return $this->bas;
  87.         }


  88. }




  89. $a = new union64;
  90. $a->in("01234567");
  91. $a->sbas(1);


  92. echo dechex($a->r8(0))."<br>";
  93. echo dechex($a->r8(1))."<br>";
  94. echo dechex($a->r8(2))."<br>";
  95. echo dechex($a->r8(3))."<br>";
  96. echo dechex($a->r8(4))."<br>";
  97. echo dechex($a->r8(5))."<br>";
  98. $a->w8(5,0x4D);


  99. echo dechex($a->r8(6))."<br>";
  100. echo dechex($a->r8(7))."<br>";

  101. echo dechex($a->r16(0))."<br>";
  102. echo dechex($a->r16(1))."<br>";
  103. echo dechex($a->r16(2))."<br>";
  104. echo dechex($a->r16(3))."<br>";


  105. echo dechex($a->r32(0))."<br>";
  106. echo dechex($a->r32(1))."<br>";

  107. echo dechex($a->r64())."<br>";
  108. echo $a->out();


  109. ?>



复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-25 10:05 , Processed in 0.966056 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表