我正在尝试对保存到宏变量中的二进制数据执行操作。下面的datastep成功地将数据保存到宏变量中而没有任何问题:
data _null_;
infile datalines truncover ;
attrib x length=$300 informat=$300. format=$300.;
input x $300.;
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格式的长度):< / p>
%let base64_string = %sysfunc(putc(%nrbquote(&str),$base64x244.));
答案 0 :(得分:3)
您可以使用%SUPERQ()
引用宏变量,而无需先对其进行扩展。请注意,它采用宏变量的名称而不是值作为其参数。
%let base64_string = %sysfunc(putc(%superq(str),$base64x244.));
但为什么不在数据步骤中进行转换并避免宏引用问题呢?