我正在尝试在PostScript中生成一个随机的十六进制字节字符串。我可以很容易地生成(伪)随机整数:
rand 255 mod
也许最好用这种方式提出问题:是否可以将整数转换为ASCII字符?还是十六进制字节?
我尝试了很多事情,但是这种语言简直是疯狂。
答案 0 :(得分:2)
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实际上是一种非常简单的语言,但由于基于堆栈,因此如今不寻常。它确实有一些微妙之处。上面程序中字符串的使用演示了如何有效地将对复合对象的引用视为指针,如果您确实确实想要复制复合对象,则需要使用复制运算符。
如果您有太多麻烦,我也很好奇为什么要使用这种语言?