在 Racket 中读取一个字节的值

Reading the value of a byte in Racket

在我的程序中,我必须通过 TCP/IP 进行通信。 为此,我必须整理要发送的数据。 有时我想发送一个整数,这完全适合一个字节。

在 Racket 中,一个整数(0 <= 数字 < 256)被认为是一个字节。 所以例如我发送:

(write 15 outputPort)
(flush-output outputPort)

在另一端,接收方必须解组接收到的数据。 所以我这样做:

(define (loop)
    (if (byte-ready? inputPort)
        (display (read-byte inputPort))
        (loop)))

我假设它显示 15(因为 0 到 255 之间的所有数字都可以放在一个字节中)但它显示 49,这是“1”的 ASCII 值。 如果我再循环一次,我将收到 53 作为第二个值,这是“5”的 ASCII 值。

那么有没有一种方法可以从 0 到 255 之间的值生成一个字节而不将数字的每个数字转换为 ASCII 值,因为这会导致发送 N 个字节,其中 N 是数字中的数字位数。

如果不可能的话,Racket 中 bytes 的优势是什么? 因为我可以简单地将我的号码作为字符串发送:

(write (number->string 15) outputPort)
(flush-output outputPort)

然后通过读取字符串解组,然后以另一种方式转换:

(string->number (read-string length inputPort))

但我想使用字节以避免发送字符串(因为对字符串的操作成本很高)所以我可以为 0 到 255 之间的数字发送一个字节而不是可能的 3 个字节(当数字包含 3 位数字时) ).

您想使用 write-byte,而不是 write:

-> (write-byte 61)
=
-> (write 61)
61

如果您使用 write-byte 而不是 write,它实际上将发送字节值而不是值的序列化表示。

同样,您可以使用write-bytes逐字节写出字节串。