在Akka-http里我们把需要传输的数据转换成ByteString,通过网络发送給接收端、接收端再把收到消息Entity中的ByteString转换成目标类型的数据。 很明显,HttpEntity可以分两大类,一种是Strict类型的,它的data是ByteString。 另一种是UniversalEntity类型,它的数据dataBytes是Source[ByteString,Any]。无论如何最终在线上的还是ByteString。 有些迷糊,不过应该complete做了些字符串到ByteString的转换。我们可以从上面这个runService函数得到证实。 转换成了String,也就是说服务器端发送的Entity里的数据是ByteString。
1.1,ByteString string 这个词本意是“串”,只不过在编程语言的世界中,我们基本都用它来指代“字符串”,其实字符串应该叫 CharString,因此 ByteString 的意义也就很好理解了 ByteString 代表一个 immutable 字节序列。对于字符数据来说,String 是非常基础的,但在二进制数据的处理中,则没有与之对应的存在,ByteString 应运而生。 和 ByteString 一样,Buffer 的实现也使用了很多高性能的技巧。 2,ByteString 详解 ByteString 整个类不到 500 行,完全可以通读,但我们还是从实际的使用例子出发。 && ((ByteString) o).size() == data.length && ((ByteString) o).rangeEquals(0, data, 0, data.length);
bytestring,也没有惰性List的内存优势 lazy bytestring就像chunk List(List中每个元素都是64K大小的strict bytestring),既减少了惰性带来的效率影响 , takeWhile, filter 所以先要避免命名冲突: -- 惰性ByteString import Data.ByteString.Lazy as B -- 严格ByteString import Data.ByteString as S 创建一个ByteString: -- Word8 List转ByteString B.pack :: [GHC.Word.Word8] -> ByteString -- 严格ByteString转惰性ByteString B.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString 其中Word8 : GHC.Word.Word8 -> B.ByteString -> B.ByteString B.cons' :: GHC.Word.Word8 -> B.ByteString -> B.ByteString
/** * 判断剩余的过期时间 */ long timeToLive(long leaseId); } 实现这个接口 import com.google.protobuf.ByteString (key), ByteString.copyFromUtf8(value)).sync(); } @Override public void put(String key, String value, long leaseId) { kvClient.put(ByteString.copyFromUtf8(key), ByteString.copyFromUtf8(value @Override public KvClient.WatchIterator watch(String key) { return kvClient.watch(ByteString.copyFromUtf8 @Override public KvClient.WatchIterator watchPrefix(String key) { return kvClient.watch(ByteString.copyFromUtf8
Akka提供了一组文件读写函数,如下: def fromPath(f: Path, chunkSize: Int = 8192): Source[ByteString, Future[IOResult chunkSize, startPosition = 0) def fromPath(f: Path, chunkSize: Int, startPosition: Long): Source[ByteString "))) def toPath(f: Path, options: Set[OpenOption] = Set(WRITE, TRUNCATE_EXISTING, CREATE)): Sink[ByteString ,_],直接就是流型式,应该可以直接放入Http消息的Entity中,如下: def fileStream(filePath: String, chunkSize: Int): Source[ByteString 因为Entity.dataByes就是Source[ByteString,_],所以我们可以直接把它导入Sink: entity.dataBytes.runWith(FileIO.toPath
因为文件内容是以一堆bytes来表示的,而http消息的数据部分也是byte类型的,所以我们可以直接用Source[ByteString,_]来读取文件然后放进HttpEntity中。 我们还提到:如果需要进行数据库数据交换的话,可以用Source[ROW,_]来表示库表行,但首先必须进行ROW -> ByteString的转换。 在上期讨论我们提到过这种转换其实是ROW->Json->ByteString或者反方向的转换,在Akka-http里称之为Marshalling和Unmarshalling。 服务端收到数据后又要进行反向的转换即把Request.Entity.dataBytes从Source[ByteString,_]转回Source[T,_]。 如果我们的目的是简单提供一个Source[ByteString,_],我们是否可以直接调用Spray-Json的函数来进行ROW->Son->ByteString转换呢?
LANGUAGE OverloadedStrings #-}import Network.HTTP.Simple (httpLBS, parseRequest, Response)import Data.ByteString.Lazy (ByteString)fetchPage :: String -> IO (Response ByteString)fetchPage url = httpLBS =<< parseRequest =>))data Video = Video { title :: String , link :: String } deriving ShowparseVideoList :: ByteString (ByteString)data Video = Video { title :: String , link :: String } deriving ShowfetchPage :: String -> IO (Response ByteString)fetchPage url = do let proxyHost = "xxxxx" proxyPort =
self.posterUrl); // 添加 canvas 到 body document.body.appendChild(canvas) }); dataURItoBlob(base64Data) { var byteString ; if (base64Data.split(',')[0].indexOf('base64') >= 0){ byteString = atob(base64Data.split(', ')[1]); }else{ byteString = unescape(base64Data.split(',')[1]); } var mimeString = base64Data.split (',')[0].split(':')[1].split(';')[0]; var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], {type
代码 //从字符串到hex byte[] bytes = "zhangsan".getBytes(StandardCharsets.UTF_8); ByteString of = ByteString.of 代码 //从字符串到base64 byte[] bytes = "zhangsan".getBytes(StandardCharsets.UTF_8); ByteString of = ByteString.of of = ByteString.of(digest); String hex = of.hex(); String base64 = of.base64(); return hex of = ByteString.of(doFinal); String hex = of.hex(); String base64 = of.base64(); return of = ByteString.of(doFinal); String hex = of.hex(); String base64 = of.base64(); return
源码 import com.alibaba.fastjson.JSON; import com.google.protobuf.Any; import com.google.protobuf.ByteString transferContractBuilder = Contract.TransferContract.newBuilder(); transferContractBuilder.setAmount(amount); ByteString bsTo = ByteString.copyFrom(to); ByteString bsOwner = ByteString.copyFrom(from); transferContractBuilder.setToAddress blockHeight); Transaction.raw rawData = transaction.getRawData().toBuilder() .setRefBlockHash(ByteString.copyFrom (ByteArray.subArray(blockHash, 8, 16))) .setRefBlockBytes(ByteString.copyFrom(ByteArray.subArray(
接下来我们看一下Okio的另一个类ByteString。 ByteString 我们知道String是的内部是基于char[] 数组来实现的,Okio的ByteString内部是基于byte[] 数组来实现的。 跟String类似,ByteString也被设计为不可变的,这样可以保证ByteString是线程安全的。 public class ByteString implements Serializable, Comparable<ByteString> { final byte[] data; ByteString byteString = new ByteString(s.getBytes(Util.UTF_8)); byteString.utf8 = s; return byteString;
string转换byte[] string strTmp = "ClearSeve"; byte[] byteString = System.Text.Encoding.Default.GetBytes (strTmp); byte[]转换string byte[] byteString = new byte[] { 0x01, 0x02, 0x03 }; string strTmp = System.Text.Encoding.Default.GetString (byteString);
bitcask-java/src/main/java/com/trifork/bitcask/BitCaskKeyDir.java public class BitCaskKeyDir { Map<ByteString , BitCaskEntry> map = new HashMap<ByteString, BitCaskEntry>(); ReadWriteLock rwl = new ReentrantReadWriteLock (); private boolean is_ready; public boolean put(ByteString key, BitCaskEntry ent) { } finally { writeLock.unlock(); } } public BitCaskEntry get(ByteString
byteString) 将字符串写入 BufferedSink write(Source source, long byteCount) 从Source写入byteCount个长度的 long readByteString() 将缓冲区全部读取为字符串 ByteString readByteString(long byteCount) 将缓冲区读取长度为byteCount的字符串 long ByteString作为一个工具类,功能十分强大,它可以把byte转为String,这个String可以是utf8的值,也可以是base64后的值,也可以是md5的值,也可以是sha256 的值 String base64() String base64Url() String utf8() ByteString sha1() ByteString sha256() static ByteString decodeBase64(String base64) static ByteString decodeHex(String hex) static ByteString
value ReadData/input_producer/limit_epochs/epochs 解码 tfrecords 时的类型一定要和制作 tfreords 时的类型一致: 这个问题主要出现在 bytestring 上,在保存图片数据时候,我们通常会 将图片 .tostring() 转成 bytestring 制作 tfrecords 然后在解码的时候,我们会用 decode_raw 将bytestring
LANGUAGE OverloadedStrings #-} import Network.HTTP.Simple (httpLBS, parseRequest, Response) import Data.ByteString.Lazy (ByteString) fetchPage :: String -> IO (Response ByteString) fetchPage url = httpLBS =<< parseRequest data Video = Video { title :: String , link :: String } deriving Show parseVideoList :: ByteString (ByteString) data Video = Video { title :: String , link :: String } deriving Show fetchPage :: String -> IO (Response ByteString) fetchPage url = do let proxyHost = "www.16yun.cn"
// 解码base64 var byteString = atob(dataURI.split(',')[1]); var mimeString = dataURI.split(',')[0].split (':')[1].split(';')[0]; // 类型数组 var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length ; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString });
// 解码base64 var byteString = atob(dataURI.split(',')[1]); var mimeString = dataURI.split(',')[0].split (':')[1].split(';')[0]; // 类型数组 var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length ; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString });
你会发现报如下错误: 错误: 无法访问ByteString找不到okio.ByteString的类文件 okio是什么鬼?我代码里也没用到它呀? 不管了,先解决问题再说。 (大概是okhttp框架里用到的) 其中一个可靠的答案给了我线索: 《OkHTTP error cannot access ByteString》 它提供了okio的官方GitHub地址:https:/
bitcask-java/src/main/java/com/trifork/bitcask/BitCaskKeyDir.java public class BitCaskKeyDir { Map<ByteString , BitCaskEntry> map = new HashMap<ByteString, BitCaskEntry>(); ReadWriteLock rwl = new ReentrantReadWriteLock (); private boolean is_ready; public boolean put(ByteString key, BitCaskEntry ent) { } finally { writeLock.unlock(); } } public BitCaskEntry get(ByteString