SAS 宏引用问题

SAS Macro quoting issues

我正在尝试对保存在宏变量中的二进制数据执行操作。下面的数据步骤成功地将数据保存到宏变量中,没有任何问题:

data _null_;
  infile datalines truncover ;
  attrib x length=0 informat=0. format=0.;
  input x 0.;
  put x=;
  call symput ('str',cats(x));
  datalines4;
‰PNG  >     IHDR   )   )   ëŠZ   sRGB ®Î=é   gAMA  ±^üa    pHYs  ;à  ;ÃÇo¨d   ZIDAT8OåŒ[ À½ÿ¥Ó¼”Ö5Dˆ_v@aw|+¸AnŠ‡;6<ÞóRÆÒÈeFõU/'“#f™Ù÷&É|&t"<ß}4¯à6†Ë-Œ_È(%<É'™èNß%)˜Î{-    IEND®B`‚
;;;;
run;

当我尝试以任何方式使用宏变量的内容时,保留字符的组合使其无法使用。以下保留字符在值中,未匹配:

&%'"()

我已经尝试了所有我能想到的宏引用函数的组合,但我什至无法使用 %put():

获得要打印的值
%put %nrbquote(&str);

结果:

SYMBOLGEN:  Macro variable STR resolves to ‰PNG  >     IHDR   )   )   ëŠZ   sRGB ®Î=é   gAMA
            ±^üa    pHYs  ;à  ;ÃÇo¨d   ZIDAT8OåŒ[
            À½ÿ¥Ó¼”Ö5Dˆ_v@aw|+¸AnŠ‡;6<ÞóRÆÒÈeFõU/'“#f™Ù÷&É|&t"<ß}4¯à6†Ë-Œ_È(%<É'™èNß%)˜Î{-
            IEND®B`‚
ERROR: The value É is not a valid SAS name.
ERROR: The SAS Macro Facility has encountered an I/O error.  Canceling submitted statements.

NOTE: The SAS System stopped processing due to receiving a CANCEL request.

最终,我想做的是使用以下语句将这些值转换为 base64 编码(我已经预先计算了 base64 格式的长度以便于调试):

%let base64_string = %sysfunc(putc(%nrbquote(&str),$base64x244.));

您可以使用 %SUPERQ() 来引用宏变量,而不必先展开它。请注意,它采用宏变量的名称而不是值作为其参数。

%let base64_string = %sysfunc(putc(%superq(str),$base64x244.));

但为什么不直接在数据步骤中进行转换并避免宏引用问题呢?