@cfrick已经回答了如何在Clojure中正确构造字节数组的问题。
为了方便起见,在Tupelo库中提供了许多字符串和字符函数,这些函数适用于Clojure和ClojureScript,它们对“字符串”的概念有不同的理解。请参阅以下内容:
以下代码展示了一些操作java.lang.String、java.lang.Character、Byte、Long和Java字节数组类型值的方式:
(ns tst.demo.core
(:use tupelo.test)
(:require
[cambium.core :as log]
[clojure.string :as str]
[tupelo.core :as t] ))
(dotest
(let [chars-vec (vec "Hi")
byte-vec (mapv byte chars-vec)
long-vec (mapv long chars-vec)
ba-nums (byte-array (mapv t/char->codepoint chars-vec))
ba-longs (byte-array long-vec)
str-0 (apply str chars-vec)
str-1 (str/join chars-vec)
str-2 (str/join (mapv char byte-vec))
str-3 (str/join (mapv t/codepoint->char long-vec))
str-4 (str/join (mapv char ba-nums))
str-5 (str/join (mapv t/codepoint->char ba-longs))]
打印结果:
(disp-types chars-vec)
(disp-types byte-vec)
(disp-types long-vec)
(disp-types ba-nums)
(disp-types ba-longs)
(println "result type: " (type str-0))
以上所有的内容都会产生相同的结果:“Hi”
(is= "Hi"
str-0
str-1
str-2
str-3
str-4
str-5)))
带有结果的
。
-------------------------------
Clojure 1.10.1 Java 13
-------------------------------
Testing tst.demo.core
chars-vec type: clojure.lang.PersistentVector value: [H i] content types: [java.lang.Character java.lang.Character]
byte-vec type: clojure.lang.PersistentVector value: [72 105] content types: [java.lang.Byte java.lang.Byte]
long-vec type: clojure.lang.PersistentVector value: [72 105] content types: [java.lang.Long java.lang.Long]
ba-nums type: [B value:
ba-longs type: [B value:
result type: java.lang.String
Ran 2 tests containing 1 assertions.
0 failures, 0 errors.
所有结果的类型都是java.lang.String
。
为了完整起见,这是显示代码:
(defn disp-types-impl
[item]
`(do
(println '~item " type: " (type ~item) " value: " ~item
" content types: " (mapv type ~item))))
(defmacro disp-types
[item]
(disp-types-impl item))