我需要将 10 到 1000 个字符的字符串(以已知但可变的语言编写)压缩到单个 UDP 数据包中。
Java 中可用的哪些压缩算法非常适合这项任务?
是否有可用的开源 Java 库来执行此操作?
最佳答案
“这取决于”。
我将从主要候选人开始:LZMA (“7-zip”),deflate (direct, zlib: deflate + small wrapper, gzip: deflate + slightly larger wrapper, zip: deflate + even larger wrapper), bzip2 (我怀疑这在这里很好,在相对大的窗口下效果最好),甚至一个其他 LZ* 分支机构,如 LZS,has an RFC for IP Payload compression但是……
...使用几种不同的方法根据实际数据和压缩/吞吐量运行一些分析。 Java 同时具有 GZIPOutputStream (“在 gzip 包装器中放气”)和 DeflaterOutputStream (“plain deflate”,推荐使用 gzip 或 zip “wrappers”)标准并且有 LZMA Java implementations (只需要压缩器,而不是容器)所以这些对于模型来说应该都是微不足道的。
如果数据包之间存在规律性,那么就有可能利用它——例如构建缓存映射、霍夫曼表,或者只是修改其中一种算法的“窗口”——但可能需要考虑数据包丢失和“解压缩性”。沿着这条路走下去虽然增加了更多的复杂性。可以在 SO: How to find a good/optimal dictionary for zlib 'setDictionary' when processing a given set of data? 找到更多帮助压缩机的想法。 .
此外,该协议(protocol)应该有一个简单的零压缩“回退”,因为一些 [特别是小的随机] 数据可能实际上不可压缩或者可能 "compress" to a larger size (zlib 实际上有这个守卫,但也有“包装器开销”,所以对于非常小的数据最好单独编码)。对于如此小的数据,还需要考虑压缩数据的“包装器”的开销——例如 gzip 或 zip。对于少于 ~100 个字符的字符串数据,这一点尤为重要。
快乐编码。
另一件需要考虑的事情是用于将字符推送到输出流中的编码。我会首先从 UTF-8 开始,但这可能并不总是理想的。
参见 SO: Best compression algorithm for short text strings这表明 SMAZ , 但我不知道这个算法将如何转换为unicode/binary。
还要考虑到并非所有的 deflate(或其他格式)实现都是一样的。就小数据的效率而言,与第三方(例如 JZlib )相比,我不了解 Java 的标准 deflate,但请考虑 Compressing Small Payloads [.NET]对于“相同的压缩”格式显示相当负数。文章也很好地结束了:
...it’s usually most beneficial to compress anyway, and determine which payload (the compressed or the uncompressed one) has the smallest size and include a small token to indicate whether decompression is required.
My final conclusion: always test using real-world data and measure the benefits, or you might be in for a little surprise in the end!
快乐的编码。这次是真的。
关于java - 在 Java 中有效压缩 10-1000 个字符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534070/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解