xielang/example/hex.xie
Copy
// 演示十六进制编解码 // 将变量a赋值为整数1234 assign $a #i1234 // 用hex指令将其转换为16进制表现形式 // 对于数字,默认是低位在后,高位在前 // 由于谢语言中,整数是64位的,因此结果将是字符串 00000000000004d2 // 注意结果是小写的 // 结果压栈 hex $a // trimSetLeft将把指定字符串左侧的指定字符(可以指定多个)删掉 // 这里是是把弹栈值去掉左侧的所有字符0,然后结果放入变量b中 // 此时结果应为字符串 4d2 trimSetLeft $b $pop 0 // 获取变量b(字符串)的长度放入变量lenT中 len $lenT $b // 输出字符串及其长度参考 pln $lenT $b // 计算表达式 (lenT / 2 + 1) * 2 // 目的是把 字符串 4d2左侧补1个0,以便保证是偶数位 // 注意谢语言中的计算是严格从左到右的,除非加括号 // 此处表达式计算结果应为4,放入变量newLenT中 eval $newLenT `$lenT / #i2 + #i1 * #i2` // 用strPad指令把变量b中的字符串左侧补0到长度为4 // strPad的用法是:字符串补零等填充操作,例如 strPad $result $strT #i5 -fill=0 -right=true,第一个参数是接收结果的字符串变量,第二个是将要进行补零操作的字符串,第三个参数是要补齐到几位,默认填充字符串fill为字符串0,right(表示是否在右侧填充)为false(也可以直接写成-right),因此上例等同于strPad $result $strT #i5,如果fill字符串不止一个字符,最终补齐数量不会多于第二个参数指定的值,但有可能少 // 结果放入变量newStr中,此处应为04d2 strPad $newStr $b $newLenT // 输出变量以便参考 pln $newStr // hexb指令与hex类似,但对数字来说将以“高位在前、低位在后”的方式来转为16进制 // 此处结果应为d204000000000000 hexb $c $a // toUpper指令将字符串转换为大写 toUpper $c $c pln c= $c // unhex指令将16进制字符串解码为字节列表(数组) unhex $d $newStr // 输出参考 pln d= $d // 对该字节数组进行计算,将高位乘以256加上低位值,将还原出1234这个整数 // 中间为了保证类型匹配,做了一些类型转换 // 相当于其他语言中的 d[0] * 256 + d[1] eval $newIntT `(? convert (?getItem $d #i0) int) * #i256 + (? convert (?getItem $d #i1) int) ` pln newIntT= $newIntT // 直接解码变量c中的16进制数据并输出查看字节列表的值 unhex $e $c pln e= $e