跳到主要内容

15.4.1 变量类型转换

15.4.1.1 ByteToStr

说明

用于将一个 byte 数据按照指定的格式转换成 string 数据。

定义

返回值,数据类型 string,转换得到的 string 数据。
ByteToStr(BitData [\Hex] / [\Okt] / [\Bin] / [\Char]);
BitData,数据类型 byte,要转换的 byte 数据,默认按照十进制转换。
\Hex,标识符,按 16 进制转换。
\Okt,标识符,按 8 进制转换。
\Bin,标识符,按 2 进制转换。
\Char,标识符,按 Ascii 码字符格式转换。

示例

例 1
VAR byte data1 = 122;
VAR string str1;
str1 = ByteToStr(data1); // "122"
str1 = ByteToStr(data1 \Hex); // "7A"
str1 = ByteToStr(data1 \Okt); // "172"
str1 = ByteToStr(data1 \Bin); // "01111010"
str1 = ByteToStr(data1 \Char); // "z"
定义 byte 类型变量 data1,赋值 122,将 data1 按不同格式转换得到不同的 string,按十进制转换得到“122”,按十六进制转换得到“7A”,按八进制转换得到“172”,按二进制转换得到“01111010”,按字符转换得到“z”。

15.4.1.2 DecToHex

说明

将十进制的数转换成十六进制数。

定义

返回值,数据类型 string,表示转换得到的 16 进制数据,用 0-9、a-f、A-F 表示。
DecToHex(str);
str,数据类型 string,表示要被转换的十进制数据,用 0-9 表示。

注意

数据范围从 0~2147483647 或 0~7fffffff。

15.4.1.3 DoubleToByte

说明

用于将 double 或 double 数组转换成为 byte 数组。

定义

返回值,数据类型 byte 数组,double 或 double 数组转换得到的 byte 数组,每 1 个 double 转换得到 8 个 byte。
DoubleToByte(dou1);
dou1,数据类型 double,要转换的 double 变量。

15.4.1.4 DoubleToStr

说明

将 double 类型的变量转换为 string。

定义

DoubleToStr(Val, Dec);
Val,数据类型 double,要转换的 double 变量。
Dec,数据类型 string,要保留的小数点位数。

注意

小数点位数最多 15 位。

15.4.1.5 HexToDec

说明

用于将 16 进制的数转换成 10 进制数。

定义

返回值,返回转换得到的 10 进制整型数据,用 0-9 表示。
HexToDec(str);
str,数据类型 string,要转换的 16 进制数据,用 0-9、a-f、A-F 表示。

注意

数据范围从 0~2147483647 或 0~7fffffff。

15.4.1.6 IntToByte

说明

用于将 int 或 int 数组转换成为 byte 数组。

定义

返回值,转换得到的 byte 数组,每 1 个 int 转换得到 4 个 byte。数据类型为 byte 数组。
IntToByte(int1);
int1,数据类型 int 或 int 数组,要被转换的整数变量或数组。

注意

数据范围从 -2147483647 ~ 2147483647。

15.4.1.7 IntToStr

说明

用于将整数转换成字符串。

定义

返回值,转换得到的字符串。
IntToStr(int1);
int1,数据类型 int,要被转换的整数变量。

注意

数据范围从 -2147483647 ~ 2147483647。

15.4.1.8 EulerToQuaternion

说明

用于将欧拉角转成四元数。

定义

返回值,表示转换结果,0 表示正常转换,其他表示异常。
EulerToQuaternion(type, A, B, C, q1, q2, q3, q4);
Type,欧拉角顺规类型,包括 EULER_XYZEULER_ZYX
A, B, C,要转换的欧拉角,数据类型 double。
q1~q4,转换得到的四元数,数据类型 double。

15.4.1.9 QuaternionToEuler

说明

用于将四元数转成欧拉角。

定义

返回值,表示转换结果,0 表示正常转换,其他表示异常。
QuaternionToEuler(type, q1, q2, q3, q4, A, B, C);
Type,欧拉角顺规类型,包括 EULER_XYZEULER_ZYX
q1~q4,要转换的四元数,数据类型 double。
A, B, C,转换得到的欧拉角,数据类型 double。

15.4.1.10 DataToBytes

说明

将指定数据类型的变量转换为字节数组(或单个字节变量),并存储到目标字节变量或数组中。

定义

DataToBytes(byte_var, index, data, type);
byte_var,存储转换后的字节数据,数据类型 byte 变量或 byte 数组。若为单个byte变量,index必须为1,仅支持一维数组。
index,起始下标(index>0),数据类型 int。
data,待转换数据,数据类型 double/int/string/bool,不支持数组类型。
type,转换类型,数据类型 string。可选值(不区分大小写):"Double""Float""Str""Int16""Int32""Int64""Bool8""Bool16"

示例

GLOBAL PROC main()
// 示例1:将转换结果存储到 byte 变量中
byte byte_var;
bool b1 = true;
DataToBytes(byte_var, 1, b1, "bool8"); // 将 b1 以 Bool8 类型转换为字节并存入 byte_var

// 示例2:将转换结果存储到 byte 数组中
byte byte_array[30];
double d1 = 10.234;
DataToBytes(byte_array, 1, d1, "double"); // 将 d1 以 Double 类型转换,并从下标1开始存储

string s1 = "hello";
DataToBytes(byte_array, 9, s1, "Str"); // 将 s1 以字符串形式转换,并从下标9开始存储
ENDPROC

注意

各转换类型占字节个数说明(64 位机器):double 8 字节,float 4 字节,int16 2 字节,int32 4 字节,int64 8 字节,bool8 1 字节,bool16 2 字节。
字节排列顺序采用小端模式(低位字节存储在数组低位)。
转换类型字符串不区分大小写,如 "double""DOUBLE""Double" 均为有效输入。
若变量 datatype 指定的类型不兼容,无法进行隐式转换,将在运行时报错。
若转换后的字节数据无法存储到 byte_var 中(如下标 index 越界或目标存储空间不足),将导致运行时错误。
该指令前瞻时触发,步退时跳过。

15.4.1.11 BytesToData

说明

将字节变量或字节数组转换为指定数据类型的变量。

定义

返回值,表示转换结果, 0 表示正常转换,其他-异常情况。
QuaternionToEuler (type,q1,q2,q3,q4,A,B,C);
Type,欧拉角顺规类型,包括 EULER_XYZEULER_ZYX
q1~q4,要转换的四元数,数据类型 double。
A, B, C,转换得到的欧拉角,数据类型 double。

BytesToData(byte_var, index, data, type);
从byte_var的指定下标index开始,根据type所指定的数据类型,提取相应数量的字节,将其转换为该类型,并将结果存储于data中。
byte_var,待转换数据,数据类型 byte 变量或 byte 数组。若为单个byte变量,index必须为1,仅支持一维数组。
index,起始下标(index>0),数据类型 int。
data,转换结果变量,数据类型 double/int/string/bool,不支持数组类型。
type,转换类型,数据类型 string。可选值(不区分大小写):"Double""Float""Str:""Int16""Int32""Int64""Bool8""Bool16"

示例

GLOBAL PROC main()
// 示例1:将 byte 变量转换为布尔型变量
byte byte_var = 0;
bool b1 = true;
BytesToData(byte_var, 1, b1, "Bool8"); // 将 byte_var 按 Bool8 类型转换,结果存入 b1
print(b1); // FALSE

// 示例2:从字节数组中提取不同类型的数据
byte byte_array[30];
double d1;
BytesToData(byte_array, 1, d1, "Double"); // 从下标 1 开始读取 8 字节,转为 double 类型存入 d1
string s1;
BytesToData(byte_array, 9, s1, "Str:5"); // 从下标 9 开始读取 5 个字节,转为字符串存入 s1
ENDPROC

该指令通常与DataToBytes联合使用,如下示例:
使用DataToBytes指令将数据转换为字节数组,再通过BytesToData指令将其还原为变量。
GLOBAL PROC main()
byte byte_array[30];
double d1 = 10.234;
DataToBytes(byte_array,1,d1,"double");

string s1 = "hello";
DataToBytes(byte_array,9,s1,"STR");

int i1 = 10;
DataToBytes(byte_array,14,i1,"int32");

bool b1 = true;
DataToBytes(byte_array,18,b1,"bool8");

double d1_res;
BytesToData(byte_array,1,d1_res,"double");
print(d1_res); // 输出:10.234

string s1_res;
BytesToData(byte_array,9,s1_res,"STR:5");
print(s1_res); // 输出:hello

int i1_res;
BytesToData(byte_array,14,i1_res,"int32");
print(i1_res); // 输出:10

bool b1_res;
BytesToData(byte_array,18,b1_res,"bool8");
print(b1_res); // 输出:TRUE
ENDPROC

注意

当转换为字符串类型时,由于无法自动推断字符串长度,需在 type 参数中通过 "Str:长度" 格式显式指定字节数,例如 "Str:5" 表示读取 5 个字节转为字符串。
若从 byte_var 中无法读取足够数量的字节以完成指定类型的转换,将触发错误。
若变量 datatype 指定的类型不兼容,无法进行隐式转换,将在运行时报错。
该指令前瞻时触发,步退时跳过。
进行类型转换前,请确认待转换数据的值域是否在目标类型的表示范围内。
浮点类型之间的转换(如 Double 转 Float)可能因精度差异造成轻微误差。
整型之间的转换若存在范围缩小,需格外注意溢出风险。

15.4.1.12 ClearRawBytes

说明

将 byte 数组内容全部清空为 0。

定义

ClearRawBytes(bytes);
bytes,byte 变量/数组。

示例

byte arr[10];
ClearRawBytes(arr); // 清空 arr 数组,全部置为 0

15.4.1.13 CopyBytes

说明

用于 byte 数组拷贝。

定义

CopyBytes(dst_byte, src_byte, cpy_size, [dst_bias, src_bias]);
类似memcpy指令,将src_byte数组,往dst_byte数组拷⻉,拷⻉数量以及数组偏移值可以通过cpy_size 、dst_bias 、src_bias 指定
dst_byte,目标 byte 数组。
src_byte,源 byte 数组。
cpy_size,拷贝数量,数据类型 int。
dst_bias,从目标 bytes 数组下标 dst_bias+1 开始写入,可选参数,默认为 0。
src_bias,从源 bytes 数组下标 src_bias+1 开始拷贝,可选参数,默认为 0。

示例

示例1
byte arr1[10] = {0,0,0,0,0,0,0,0,0,0};
byte arr2[10] = {1,2,3,4,5,6,7,8,9,10};
CopyBytes(arr1,arr2,10); // 完整拷贝
print(arr1); // 输出:{1,2,3,4,5,6,7,8,9,10 }
print(arr2); // 输出:{1,2,3,4,5,6,7,8,9,10 }

示例2
byte arr1[10] = {0,0,0,0,0,0,0,0,0,0};
byte arr2[10] = {1,2,3,4,5,6,7,8,9,10};
// 从arr2的第3个元素开始,拷贝5个元素,然后从arr1的第2个元素开始写入
CopyBytes(arr1,arr2,5,1,2);
print(arr1); // {0,3,4,5,6,7,0,0,0,0 }
print(arr2); // {1,2,3,4,5,6,7,8,9,10 }