我试图在PostScript中生成一个随机的十六进制字节串。我可以很容易地生成(伪)随机整数:
rand 255 mod
也许问题更好的是这样:有没有办法将整数转换为ASCII字符?还是一个十六进制字节?
我尝试了很多东西,但这种语言完全是疯狂的。
PostScript中没有“ASCII字符”这样的东西(在ASCII85编码数据源之外),你生成的数字已经是一个'十六进制字节',因为它是一个8位整数值。
语言中没有与您要查找的对应的数据对象(ASCII字符或十亿字节字节)。但是你还没有真正说出你的目标是什么,如果我们更多地了解这些数字的预期最终用途,那么提供建议就会容易得多。
我要假设,因为你想'生成一个十六进制字节的随机字符串',你实际上想要一个字符串。因此,您需要做的第一件事是创建一个足以容纳输出的字符串。你没有说你的预期输出有多大,所以假设你想要一个20字节的字符串。
20 string
将创建一个长度为20个字节的字符串。然后,您希望生成并存储20个字节的数据。当然,最简单的方法就是循环。所以类似于:
0 1 19 {
pop % remove the loop count from the stack
rand % generate a number in the range 0->2^31 -1
255 mod % modulo down to the range 0->255
} for
然后,您希望将这些字节放入字符串中,以便使用put
运算符。这在第3版PostScript语言参考手册的第635页中定义。根据复合对象参数的类型,有三种变体;数组,字典或字符串,你显然想要字符串版本。这需要三个论点;字符串,要放置值的字符串的索引,以及放在该位置的值。
它很容易使用我们从上面的循环中的堆栈弹出的索引作为字符串的索引。所以剩下的就是组装我们的程序:
20 string % Create a string to hold our output
0 1 19 % initial value, increment, and limit, for the loop
{ % stack - string, index
1 index % copy the string, stack - string, index, string
exch % swap top two stack elements stack - string string index
rand % geenrate random number stack - string string index rnd
255 mod % bring into range stack - string string index rnd
put % put 'rnd' into 'string' at position 'index' stack - string
} for % end procedure
%
% stack now contains string with 20 random bytes 0->255
如果它更方便你可以使用数组而不是字符串,技术是完全相同的。
PostScript实际上是一种非常简单的语言,但它现在很不寻常,因为它是基于堆栈的。它确实有一些微妙之处;在上面的程序中使用字符串演示了如何有效地将对复合对象的引用视为指针,如果您确实想要复制复合对象,则需要使用复制运算符。
如果你遇到这么多麻烦,我也很好奇你为什么要使用这种语言?