一次弄懂aardio中的数据类型转换

背景知识:

计算机中的数据都是以二进制方式存储的。它的基本存储单元是bit(翻译为位)。1个bit只能存储1个值,要么是0,要么是1。很多个bit连接起来,也就是0和1穿成串,就能存储数据了。

bit容量太小,于是人们将8个bit定义为一个更大的存储单元,叫做byte(翻译为字节)。1个byte可以存储2的8次方,也就是256个值,分别是0-255。很多个byte穿成串,也就能存储数据了。
因此也可以说,计算机中的数据都是以byte串方式存储的。

byte串也叫byte数组。计算机调取这些byte数组以后,根据应用场景,将其展现为整数、小数、字符串等各种形式。例如,当应用场景为字符串时,计算机就会认为byte数组中存储的值是字节码,然后按照编码规则,展现字符串。同一个byte数组,可以展现为不同的数据类型,但是展现成什么有意义,只有存储数据的人清楚。

byte数组与其展现的特定数据之间,是本质与现象的关系,可以互相转换。这在aardio中是非常方便的。

import console; 

//一、Buffer——byte数组的表示方式【推荐】
//aardio提供了raw.buffer()函数,直接生成byte数组。使用方法如下:
var buf1=raw.buffer(4,1) //生成长度为4的byte数组,每个byte初始值为1。省略参数2则初始值为0。
var buf2=raw.buffer("ABCD")//复制字符串abcd对应的byte数组,不影响原字符串。
var buf3=raw.buffer({int num=1234}) //复制整数1234对应的byte数组,用到了结构体。
//输出看看
for (i=1;#buf1) console.print(buf1[i])
for (i=1;#buf2) console.print(buf2[i])
for (i=1;#buf2) console.print(buf3[i])//索引小的byte代表低位,索引大的byte代表高位。

//二、byte[]——byte数组的另一种表示方式【不推荐】
//aardio是动态语言,一般不需要声明数据类型,而是根据应用场景自动转换。
//通过结构体可以显示声明数据类型。
//结构体可以先创建类,再实例化,也可以直接声明。
//结构体就是在哈希表的键名前标注数据类型,例如上面用到的{int num=1234}。
var buf4={
	byte b[4]={11,22,33,44}//键名可以随意起,前后一致就可以。
}
for (i=1;#buf4.b) console.print(buf4.b[i])//.b不可省略。

//三、Convert——专门用于数据类型转换的函数
//前面介绍的raw.buffer已经可以将字符串、结构体转换为byte数组。
//aardio还提供了raw.convert(),专门进行数据转换。例如:
//将小数123.456转换为byte数组:
var from={double d=123.456}
var to=raw.buffer(8)
var buf5=raw.convert(from,to)
for (i=1;#buf5) console.print(buf5[i])
//将byte数组转换为小数123.456:
var n=raw.convert(buf5,{double n}).n//.n不可省略
console.log(n)
//将byte数组转换为整数呢?
var n=raw.convert(buf5,{int n}).n
console.log(n)
//如果直接输出,相当于展现为字符
console.log(buf5)//可以输出,但是乱码无意义

//四、byte数组与十六进制的转换(一)
//群友问题:aardio数组3F F0 5E 35 3F 7C ED 91如何转double(1.023)?
//这里给出的不是数组,而是字符串,我们先转换为数组
var tab=string.split("3F F0 5E 35 3F 7C ED 91"," ")
//生成byte数组,为下面转换作准备
var buf=raw.buffer(8)
for (i=1;8) buf[i]=tonumber(tab[i],16)
buf=string.reverse(buf)//索引小的byte代表低位(字符串右端)
//byte数组转为double
var n=raw.convert(buf,{double n}).n
console.log(n)

//上面题目的另一种算法
var str =string.replace("3F F0 5E 35 3F 7C ED 91"," ","")
var hex="0X"++str
var n=raw.convert({long hex=hex},{double n}).n
console.log(n)

//五、byte数组与十六进制的转换(二)
//群友问题:0xAABBCCDD如何转换为内存字节的形式,如:DD CC BB AA
//这里给出的不是字符串,不应该直接按照字符串进行处理。
var buf=raw.buffer({int hex=0xAABBCCDD})
//这样实际已经转换完成了。但是群友要的是输出形式是16进制。
var tab={}
for (i=1;#buf) table.push(tab,string.format("%02X",buf[i] ))
var str=string.join(tab," ")
console.log(str)

//六、字符串与二进制的转换
//群友问题:如何将二进制串"01100001 01100010 00110000"转换为字符串
var str="01100001 01100010 00110000"
var bin=string.split(str," ")
var buf=raw.buffer(#bin)
for (i=1;#buf){
	buf[i]=tonumber(bin[i],2)
}
console.log(buf)
//如果反过来将字符串ab0转换成二进制串呢?
//字符串一般可以直接当做byte数组使用,不过只能读取,不能写入。
var buf="ab0"
var bin={}
for (i=1;#buf){
	bin[i]=string.format("%08b",buf[i] )
}
var str=string.join(bin," ")
console.log(str)

console.pause(true);

你可能感兴趣的:(aardio,经验分享)