pack可视为将一系列的片段的数值打包在一起,可用于对dev档案、socket、memory的读写,
因为这些需要一块完整的memory,而且需要事先打包成特定格式;
而unpack可以视为将将这些完整的 memory切割计算,取得我们所需要各部分的Variable。
#把一个字符串转为十六进制格式
my $source = 'abcd';
#这个'H'是说明转化为十六进制, 后面的*是任意长度,也就是说, 它转化后多少就多少
#如果单纯写unpack('H', $source), 只显示转化后的十六进制的第一位字符
unpack('H*', $source);
#将asicc码转为unicode,比如 1变成unicode是1 ,用unpack转过后就是49
#对应js中的str.charCodeAt(i)这个方法
unpack("U*", $num)
#sprintf()函数返回一个格式化字符串
# %c:一个带有给定数字的字符 %s:一个字符串 %d:一个有符号整数,十进制 %u:一个无符号整数,十进制
# %o:一个无符号整数,八进制 %x:一个无符号整数,十六进制 %e:一个浮点数,用科学记数法表示
# %f:一个浮点数,用固定的小数点表示 保留两位小数点 %.2f %b:一个无符号整数,二进制
# 对应js中的 toString(16)这个方法
sprintf("%1x",xxx)
比如现在要将7700000126000006201710181339这一串字符转化为unicode
用unpack方法最后得到的结果便是37373030303030313236303030303036323031373130313831333339
然后再将得到的unicode转化为16进制,最后得到的结果就是8e948b6697bd2e674c8f076467cf65e3583cd48c03b3d40d19401b296d5d9c40
在perl中加密用的是Digest::SHA这个包,而常用的加密方法则是这几个sha256 sha256_hex sha256_base64
所以一般就直接在加载包的时候就写上 use Digest::SHA qw(sha256 sha256_hex sha256_base64);
这里要说说明一下,hex代表16进制,Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,
Base64就是一种基于64个可打印字符来表示二进制数据的方法。
SHA即Secure Hash Algorithm,哈希散列算法,SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512
sha256_hex就代表说用16进制来读取需加密数据,再用sha-256进行加密
sha256_base64就是用base64格式读取需加密数据,再进行加密
在js中相对应的加密代码是
var shaObj = new jsSHA("SHA-256", "HEX");
shaObj.update(asiic);
var authcode = shaObj.getHash("B64");
需要注意的是 jsSHA("SHA-256", "HEX")这段代码,以hex(16进制)读入数据,再进行加密,这就需要先把数据先转换为16进制,这就是
上面提到的js的两步操作,而在perl中,无需这么麻烦,可以直接省略转化16进制的这一步,直接用sha256_base64进行加密。
再有就是取得系统时间的问题,在js中时间取得比较麻烦,因为取出来的系统时间不一定符合你需要的格式,所以需要进行再加工,比如
我要的时间是20180203,而js取得的时间则是201823,这时我就需要将取得时间进行格式上的再修改
var date = new Date();
var str = "yyyyMMddHHmm";
str = str.replace(/yyyy|YYYY/, date.getFullYear());
str = str.replace(/MM/, date.getMonth() >= 9 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1));
str = str.replace(/dd|DD/, date.getDate() > 9 ? date.getDate().toString() : '0' + date.getDate());
str = str.replace(/hh|HH/, date.getHours() > 9 ? date.getHours().toString() : '0' + date.getHours());
str = str.replace(/mm/, date.getMinutes() > 9 ? date.getMinutes().toString() : '0' + date.getMinutes());
需要写这么一大段代码
而在perl中则不必这么大费周章,直接调用 use POSIX qw(strftime) 这个方法即可
my $current_date = strftime( "%Y%m%d%H%M", localtime );
这么一段就解决问题了
一键复制
编辑
Web IDE
原始数据
按行查看
历史