Hex 使用位操作将十六进制转换为字符

Hex 使用位操作将十六进制转换为字符,hex,character,bitwise-operators,ibm-midrange,rpg,Hex,Character,Bitwise Operators,Ibm Midrange,Rpg,假设我得到了这个十六进制值xxx00780078080078 如何使用位操作将十六进制值转换回字符? 我可以吗?我想您可以使用“按位”操作来完成,但这可能是一个可怕的代码混乱,而且完全没有必要,因为ILE RPG可以使用适当的内置函数轻松完成 首先,你并没有通常认为的“十六进制”值。也就是说,您正在显示一个值的十六进制表示形式;但基本的“十六进制”转换不会给出有用的结果。您显示的似乎是“xxx”的UCS-2值 下面是一个简单的示例,展示了将十六进制字符串转换为标准字符值的过程: d

假设我得到了这个十六进制值
xxx
00780078080078

如何使用位操作将十六进制值转换回字符? 我可以吗?

我想您可以使用“按位”操作来完成,但这可能是一个可怕的代码混乱,而且完全没有必要,因为ILE RPG可以使用适当的内置函数轻松完成

首先,你并没有通常认为的“十六进制”值。也就是说,您正在显示一个值的十六进制表示形式;但基本的“十六进制”转换不会给出有用的结果。您显示的似乎是“xxx”的UCS-2值

下面是一个简单的示例,展示了将十六进制字符串转换为标准字符值的过程:

 d                 ds
 d charField                      6    inz( x'007800780078' )
 d UCSField1                      3c   overlay( charField )

 d TargetField     s              6
 d Length          s             10i 0

  /free
    Length = %len( %trim( UCSField1 ));
    TargetField = %trim( %char( UCSField1 ));

    *inlr = *on;
    return;
  /end-free
该代码有一个包含两个子字段的DS。第一个是一个简单的字符字段,它声明初始化为x'007800780078'的六个字节的内存。第二个子字段声明为数据类型“C”,以指示UCS-2,并覆盖第一个子字段。因为它是UCS-2,所以它的大小被指定为“3”,以允许三个字符。(每个字符的宽度为16位。)

可执行语句没有做太多的工作,只足以让您测试转换后的值。使用debug,您应该看到长度变成(3),TargetField变成“xxx”


%CHAR()内置函数可用于将UCS-2转换为程序使用的字符编码。相反,使用%UCS2()内置函数。

谷歌是你的朋友。嗨@Charles,我知道(并发现)如何转换十六进制数,但找不到字符串的任何优点。我知道有桌子,但我想用一种“通用”的方式。这可能是答案吗?