第122章 Caché 函数大全 $ZWPACK,$ZWBPACK函数

206 阅读1分钟

第122章 Caché 函数大全 $ZWPACK$ZWBPACK函数

将两个8位字符打包为一个16位字符。

大纲

$ZWPACK(string)

$ZWBPACK(string)

参数

string 由两个或多个8位字符组成的字符串。字符串必须是偶数个字符。

描述

$ZWPACK函数将8位字符的字符串包装为16位宽字符的字符串(按小端顺序)。两个8位字符打包成一个16位字符。

$ZWBPACK执行相同的任务,但是8位字符以大端顺序存储在16位宽字符中。

打包字符串是一种将字符串的字符数减半以进行存储和字符串处理的方法。解压缩将恢复原始的8位字符串以供显示。当数据中允许使用Unicode字符时,不应使用这些操作。

输入字符串具有以下要求:

  • 字符串必须由偶数个字符组成。空字符串是允许的,并返回空字符串。指定奇数个字符会导致 <FUNCTION> 错误。
  • 字符串不能包含任何多字节字符。可以对字符串使用$ZISWIDE来检查它是否不包含多字节字符。如果对包含多字节字符的字符串使用$ZWPACK$ZWBPACK,则系统会生成<WIDE CHAR>错误。

示例

请注意,以下示例需要Caché的Unicode安装。

以下示例显示$ZWPACK将四个8位字符打包为两个16位宽字符。请注意,在打包字符串的宽字符中,字节的字节序为低位顺序:十六进制4241 4443。

/// d ##class(PHA.TEST.Function).ZWPACK()
ClassMethod ZWPACK()
{
	SET str=$CHAR(65,66,67,68)
	WRITE !,$LENGTH(str)," characters: ",str
	WRITE !,"$ZWPACK"
	SET wstr=$ZWPACK(str)
	WRITE !,$LENGTH(wstr)," packed characters: ",wstr
	ZZDUMP wstr
	WRITE !,"$ZWUNPACK"
	SET nstr=$ZWUNPACK(wstr)
	WRITE !,$LENGTH(nstr)," unpacked characters: ",nstr
}
DHC-APP> d ##class(PHA.TEST.Function).ZWPACK()
 
4 characters: ABCD
$ZWPACK
2 packed characters: ????
0000: 4241 4443                                               ????
$ZWUNPACK
4 unpacked characters: ABCD

以下示例显示$ZWBPACK将四个8位字符打包为两个16位宽字符。请注意打包字符串的宽字符中字节的大端顺序:十六进制4142 4344。

/// d ##class(PHA.TEST.Function).ZWBPACK()
ClassMethod ZWBPACK()
{
	SET str=$CHAR(65,66,67,68)
	WRITE !,$LENGTH(str)," characters: ",str
	WRITE !,"$ZWBPACK"
	SET wstr=$ZWBPACK(str)
	WRITE !,$LENGTH(wstr)," packed characters: ",wstr
	ZZDUMP wstr
	WRITE !,"$ZWBUNPACK"
	SET nstr=$ZWBUNPACK(wstr)
	WRITE !,$LENGTH(nstr)," unpacked characters: ",nstr
}

DHC-APP>d ##class(PHA.TEST.Function).ZWBPACK()
 
4 characters: ABCD
$ZWBPACK
2 packed characters: ????
0000: 4142 4344                                               ????
$ZWBUNPACK
4 unpacked characters: ABCD

以下示例在打包之前验证字符串:

/// d ##class(PHA.TEST.Function).ZWBPACK1()
ClassMethod ZWBPACK1()
{
	SET str=$CHAR(65,66,67,68)
	IF $ZISWIDE(str) {
		WRITE !,str," contains wide characters"
		QUIT 
	} ELSEIF $LENGTH(str) # 2  {
		WRITE !,str," contains an odd number of characters"
		QUIT 
	} ELSE {
		WRITE !,str," passes validation" 
	}
	WRITE !,$LENGTH(str)," characters: ",str
	SET wstr=$ZWPACK(str)
	WRITE !,$LENGTH(wstr)," packed characters: ",wstr
	ZZDUMP wstr
}
DHC-APP>d ##class(PHA.TEST.Function).ZWBPACK1()
 
ABCD passes validation
4 characters: ABCD
2 packed characters: ????
0000: 4241 4443