<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[a_lzq的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/a_lzq</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; a_lzq]]></copyright><item><title><![CDATA[算法--深入理解习算计系统(第三版)习题3.60]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/118518537</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/118518537</guid><author>a_lzq</author><pubDate>Tue, 06 Jul 2021 13:38:59 +0800</pubDate><description><![CDATA[深入理解习算计系统习题3.60

此题看课本中给出的汇编代码(实际我用的编译器并没有这么做)

说明问题,第二行对xp可能为空的时候没有考虑.那么如何在xp为空的时候避免对*xp求值呢?答案就是避免求值
long cread_alt(long *xp){
	long c = 0;
	long *p = xp?xp:&amp;c;
	return *p;
}

这样将避免了对*xp在第一步的求值,从而表面对空指针求值.

...]]></description><category></category></item><item><title><![CDATA[算法--ux＞-1]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/117251147</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/117251147</guid><author>a_lzq</author><pubDate>Tue, 25 May 2021 10:54:28 +0800</pubDate><description><![CDATA[算法--ux&gt;-1
在csapp中有个题目是这样的
u代表无符号数
x代表任何整数
上述表达式在课堂中表述是永远不成立的.原因就在于-1会被转成无符号数也就是FFFFFF….FFFF,所以ux&lt;=-1才是正确的表达.

]]></description><category></category></item><item><title><![CDATA[算法--空间复杂度O(1)的快速排序]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/115694817</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/115694817</guid><author>a_lzq</author><pubDate>Wed, 14 Apr 2021 11:41:18 +0800</pubDate><description><![CDATA[算法-空间复杂度大O1的快速排序
不考虑占用空间的大小
比较简单
 $arr = [1,3,2,6,7,8,6,5,4,2,2,2,2,2,0,0,0,0,0,0,0,0,0];
function q( $arr ){
	//排除极限情况
	$len = count($arr);
	if($len &lt;= 1){
		return $arr;
	}
	$mid = $arr[0];
	$right = [];
	$left = [];
	for( $i = 1 ; $i &lt;= $len-1 ;  ]]></description><category></category></item><item><title><![CDATA[PHP源码分析-函数array_merge的”BUG”]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/110632359</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/110632359</guid><author>a_lzq</author><pubDate>Fri, 04 Dec 2020 11:51:14 +0800</pubDate><description><![CDATA[PHP源码分析-函数array_merge的”BUG”
首先来看段代码.

&lt;?php
$a = [  '2'  =&gt; 'a'  ,  'k'   =&gt;  'g'  ];
$b = [ '6'  =&gt;   'h'   ,  'd'  =&gt;  's'   ];

$c = array_merge( $a , $b );
$d = array_merge( $b , $a );

var_dump( $c , $d );


运行结果
	array(4) {
	[0]=&gt;
	]]></description><category></category></item><item><title><![CDATA[PHP源码分析-进制转换函数分析]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/109035136</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/109035136</guid><author>a_lzq</author><pubDate>Mon, 12 Oct 2020 19:46:23 +0800</pubDate><description><![CDATA[PHP源码分析-进制转换函数分析
Php的进制转换大概可以分为两个类
1.其他进制转换十进制
bindec 二进制转换十进制
hexdec 十六进制转换十进制
octdec 八进制转换十进制
base_convert在任意进制之间转换数字
2.十进制转换其他进制
decbin  十进制转换为二进制
dechex  十进制转换为十六进制
decoct  十进制转换为八进制
base_convert在任意进制之间转换数字
先来看看其他进制转换十进制以2进制为例
先简单说明计算方法.
例如:10101转换为10进]]></description><category></category></item><item><title><![CDATA[PHP源码分析-hex2bin函数源码分析]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/109002082</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/109002082</guid><author>a_lzq</author><pubDate>Sat, 10 Oct 2020 18:15:28 +0800</pubDate><description><![CDATA[PHP源码分析-php2bin函数源码分析
这个函数看字面意思是十六进制转二进制但是实际的意思十六进制转字符串.这也算是php的一个坑吧.需要说明一点是php中十六进制转二进制需要通过十进制中转.不知道是为了统一还是为了简单,下次分析下进制转换的函数.这次主要里看看php2bin函数,代码不多,但是大多数是位运算.看上去挺烧脑的.
下边是相应的源码和注释说明
static zend_string *php_hex2bin(const unsigned char *old, const size_t oldl]]></description><category></category></item><item><title><![CDATA[GO-golang生成MD5-md5]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108801173</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108801173</guid><author>a_lzq</author><pubDate>Fri, 25 Sep 2020 17:31:56 +0800</pubDate><description><![CDATA[GO-golang生成MD5-md5
Md5 := md5.New()
io.WriteString(Md5, "123456")
rst := fmt.Sprintf("%x", Md5.Sum(nil))
fmt.Println(rst)

结果
e10adc3949ba59abbe56e057f20f883e

Process finished with exit code 0


]]></description><category></category></item><item><title><![CDATA[GO-golang关于时间的一些处理,获取当前时间以及和当前时间相关的时间,时间串转换为当前时间]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108521919</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108521919</guid><author>a_lzq</author><pubDate>Thu, 10 Sep 2020 20:19:30 +0800</pubDate><description><![CDATA[GO-golang关于时间的一些处理,获取当前时间以及和当前时间相关的时间,TZ时间转换为当前时间
//当前时间
time.Now().Format("2006-01-02 ")
time.Now().Format("2006-01-02 15:04:05")
//一年以后
time.Now().AddDate(+1, 0, 0).Format("2006-01-02 15:04:05") 
//一个月以后
time.Now().AddDate( 0, +1, 0).Format("2006-01-02 1]]></description><category></category></item><item><title><![CDATA[GO-使用golang解密使用php的openssl_encrypt加密的结果(AES-128-ECB)(包括加密原值大于16位的情况),以及关于和java通信时的一些说明]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108392654</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108392654</guid><author>a_lzq</author><pubDate>Thu, 03 Sep 2020 20:49:42 +0800</pubDate><description><![CDATA[GO-使用golang解密使用php的openssl_encrypt加密的结果,以及关于和java通信时的一些说明
直接看源码
&lt;?php
$key = "1234567887654321"; 
var_dump(bin2hex(openssl_encrypt('1234','AES-128-ECB',$key,OPENSSL_RAW_DATA )));

结果
4f87a3233278f5f9539ffd3b36b5ee37

go源码
func main() {
key := []byte("12]]></description><category></category></item><item><title><![CDATA[GO-使用golang实现C语言中的memset函数效果]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108381908</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108381908</guid><author>a_lzq</author><pubDate>Thu, 03 Sep 2020 14:21:44 +0800</pubDate><description><![CDATA[void *memset(void *s, int ch, size_t n);
函数解释：将s中当前位置后面的n个字节 （typedef unsigned int size_t ）用 ch 替换并返回 s 。
memset：作用是在一段内存块中填充某个给定的值，它是对较大的结构体或数组进行清零操作的一种最快方法  。
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer：为指针或是数组,c：是赋给buffer的值,c]]></description><category></category></item><item><title><![CDATA[GO-使用golang解密使用php的openssl_encrypt加密的结果以及key的长度不满足要求时的处理方法(AES-128-CBC/AES-256-CBC)]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108204967</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108204967</guid><author>a_lzq</author><pubDate>Mon, 24 Aug 2020 19:24:13 +0800</pubDate><description><![CDATA[GO-使用golang解密使用php的openssl_encrypt加密的结果以及key的长度不满足要求时的处理方法
不通语言之间的通讯尤其涉及到标准加密的情况的时候往往有很多不标准的事情闹得人焦头烂额的.今天就在处理php和go的加密通讯的时候遇到了问题.
首先来看下正常的情况下的通讯
php加密部分
&lt;?php
$iv = "1234567890abcdef";
$key = "abcdef1234567890";
//使用OPENSSL_RAW_DATA,多一次转换,方便说明白通讯过程
echo]]></description><category></category></item><item><title><![CDATA[PHP源码分析-命令行模式(cli模式)下echo实现的源码分析和执行追踪]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108148257</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108148257</guid><author>a_lzq</author><pubDate>Fri, 21 Aug 2020 16:25:14 +0800</pubDate><description><![CDATA[PHP源码分析-命令行模式-cli模式-下echo实现的源码分析和执行追踪
一般的php程序员打断点的方式都是echo ,而echo最为我们最常用的语句对于其源码剖析也是值得我们去好好探究一番的,今天就以cli模式下的echo来具体追踪下php是如何实现"echo"的
php版本:PHP 7.3.18
系统:linux
首先看这段代码
&lt;?php
echo 1234;

非常简短,就是在终端打印一个字符1234,执行结果也比较简单明了
[root@localhost ~]# php 20200820.]]></description><category></category></item><item><title><![CDATA[GO--go的json解析的两种法及注意事项]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/108144045</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/108144045</guid><author>a_lzq</author><pubDate>Fri, 21 Aug 2020 11:49:27 +0800</pubDate><description><![CDATA[GO--go的json解析的两种法及注意事项
最近打算用go来写项目,随便来学习下大家都认可的这门语言,谨做一些学习记录
package main

import (
	"encoding/json"
	"fmt"
)
//这里需要在注意 结构体里的key首字母必须大写,而且除首字母之外key的其余部分需要和json中的key保持一致
type Origin struct{
	First_key string
}
type Result struct {
	SecondKey string
}

type ]]></description><category></category></item><item><title><![CDATA[算法--随机算法之水塘抽样(Reservoir sampling)以及算法证明]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107920376</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107920376</guid><author>a_lzq</author><pubDate>Mon, 10 Aug 2020 20:33:04 +0800</pubDate><description><![CDATA[@[TOC](算法–随机算法之水塘抽样(Reservoir sampling)以及算法证明)
假设有这么一个问题,在人流穿梭的上海南京路的劲头,有电视台在采访,要求随机在一个小时内抽取一个人来进行采访.
首先分析这个问题:
1.你不能要求所有人都在这里等着,主要是电视台给的备用凳子不够只能保持一个人在凳子上.
2.不知道总数,人流是随机的不知道总数,所以不能得到总数N,然后通过1/N来得到相应的人.
3.怎么办?
最开始这个问题是在高纳德的&lt;&lt;计算机程序设计艺术&gt;&gt;一书中提出来的原本]]></description><category></category></item><item><title><![CDATA[算法--Google的楼层扔鸡蛋问题]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107869109</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107869109</guid><author>a_lzq</author><pubDate>Fri, 07 Aug 2020 19:56:28 +0800</pubDate><description><![CDATA[算法-Google的楼层扔鸡蛋问题
扔鸡蛋问题其实在网上已经在网上有很多答案了,有的使用迭代法,有的根据递归和的方法.对于可接受的方法来说递归和的方法无疑是可以做的有效的计算的方法,迭代法随便给个值以后简直可以认为无解.但是大部分人给出递归和的同时往往缺少一个严谨的证明,从而导致整个方法所依赖的理论是不成立的.迭代法就不多说了,网上的文章一搜一大把.今天着重说下通过递归和方法的证明.
先看题目
一幢 100 层的大楼,给你两个鸡蛋. 如果在第 n 层扔下鸡蛋,鸡蛋不碎,那么从前 n-1 层扔鸡蛋都不碎.
这]]></description><category></category></item><item><title><![CDATA[PHP源码分析-流的实现之主要的用到的结构体和结构体间的关系]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107824865</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107824865</guid><author>a_lzq</author><pubDate>Wed, 05 Aug 2020 20:54:49 +0800</pubDate><description><![CDATA[PHP源码分析-主要的用到的结构体和结构体间的关系


]]></description><category></category></item><item><title><![CDATA[PHP源码分析-流的实现之file流的链接和glob流的链接]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107823805</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107823805</guid><author>a_lzq</author><pubDate>Wed, 05 Aug 2020 20:41:23 +0800</pubDate><description><![CDATA[PHP源码分析-流的实现之file流的链接和glob流的链接
显而易见file://流是对本地文件的处理,而glob的流则简单的做下描述.
glob:// — 查找匹配的文件路径模式

PHP的文档提供的说明…简单明了.
下边是个简单的例子
&lt;?php
$it = new DirectoryIterator("glob://D:/wamp64/www/*.php");
foreach($it as $f) {
    printf("%s: %.1FK\n", $f-&gt;getFilename()]]></description><category></category></item><item><title><![CDATA[PHP源码分析-流的实现之ftp流的连接和data流的解析]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107701251</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107701251</guid><author>a_lzq</author><pubDate>Thu, 30 Jul 2020 21:50:59 +0800</pubDate><description><![CDATA[PHP源码分析-流的实现之ftp流的连接和data流的解析
前边几章分析完http的链接之后,这里趁热打铁分析下ftp是如何链接远程服务器的,并顺带分下一个特殊的协议data.(这里提一句本文的代码顺序和源码顺序不一致,为的是说明方便,C语言对待吗顺序是有要求的)
首先从注册开始
php_register_url_stream_wrapper("ftp", &amp;php_stream_ftp_wrapper);

然后下一步跟踪代码

PHPAPI const php_stream_wrapper ph]]></description><category></category></item><item><title><![CDATA[PHP源码分析-流的实现之parse_url的源码分析]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107675050</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107675050</guid><author>a_lzq</author><pubDate>Wed, 29 Jul 2020 20:58:31 +0800</pubDate><description><![CDATA[PHP-流的实现之parse_url的源码分析
&lt;scheme&gt;://&lt;user&gt;:&lt;password&gt;@&lt;host&gt;:&lt;port&gt;/&lt;path&gt;;&lt;params&gt;?&lt;query&gt;#&lt;frag&gt;

此处是一个完整的url的组成,这里只对每个段做简单的说明, scheme:协议部分,例如:http
user和password:用户名和密码,最原始的协议规定的用户名和密码,以http为例如果服务器设置了此]]></description><category></category></item><item><title><![CDATA[PHP源码分析-流的实现之普通http流的处理]]></title><link>https://blog.youkuaiyun.com/a_lzq/article/details/107643405</link><guid>https://blog.youkuaiyun.com/a_lzq/article/details/107643405</guid><author>a_lzq</author><pubDate>Tue, 28 Jul 2020 20:35:28 +0800</pubDate><description><![CDATA[PHP-流的实现之普通http协议的解析
前一章处理说完标输入流的处理,这章看下php是如何针对普通的http网络流建立连接的.
php_register_url_stream_wrapper("http", &amp;php_stream_http_wrapper);

类似上一章的方法搜索
//首先是
PHPAPI const php_stream_wrapper php_stream_http_wrapper = {
	&amp;http_stream_wops,
	NULL,
	1 /* is_ur]]></description><category></category></item></channel></rss>