【问题标题】:Is it possible to write in file in 20bits instead of 8,16,32 in java?是否可以用 20 位而不是 java 中的 8、16、32 位写入文件?
【发布时间】:2019-10-05 00:50:45
【问题描述】:

所以我目前正在研究 lzw 算法以了解压缩,我想知道是否可以写入具有自定义大小位的文件。

所以我正在使用 DataOutputStream,我只能用 8、16 和 32 位写入,但我想知道是否可以写入 20 位以节省空间。我所说的节省空间的意思是当我压缩我的文件时,我的代码是 19 位的,所以我不想用 writeInt() 把它们写成 32 位,我想用 20 位来写它们,这样压缩的文件会更小。

【问题讨论】:

  • 不是 100%(只有 98%)肯定,但纯 java 不可能。您可以写入/读取输入流的数据的最小部分是字节 - 因此无法存储由 8 位段组成的 20 位。 24 是最接近的。我认为这在本机文件系统中甚至是不可能的,因为扇区(因此数据块)总是 2 的力量
  • 一种方法是将您的数据压缩成一个long[],其中每个long 可以保存多个数据。我在library that I've created 中为无关的事情做了类似的事情。您也许可以根据自己的尝试进行调整。
  • @Antoniossss 我如何设法获得 24 ?我没有看到任何 24 位的原始类型
  • ImageOutputStream 可以做到这一点。将 File 或 OutputStream 作为参数传递给创建方法。
  • @guillaume 只使用 3 个字节

标签: java bit file-writing file-read


【解决方案1】:

Java 支持的最小数据单位是一个 8 位字节。因此,您可以使用 Java 编写的存储 20 位信息的最小文件大小为 24 位(3 个字节)。

还有一个事实是,大多数操作系统支持的底层文件系统不支持任意位大小的文件。

但是,如果您的意思是如果有可能有一个语义上是 20 位段序列的数据流,那肯定是可能的。您只需对数据进行位移即可使用写入 8、16 或 32 位的方法。

例如 20 位的 2 个段可以用 5 个字节写入,其中前 2 个字节包含第一个段的 16 位,中间字节包含第一个段的剩余 4 位和第二个段的前 4 个位段,最后 2 个字节包含第 2 段的剩余 16 位:

|--------------------------------------------|
|  1st 20 bit segment  | 2nd 20 bit segment  |
|--------------------------------------------|
| byte1  | byte2  | byte3  | byte4  | byte5  |
|--------------------------------------------|

【讨论】:

  • 我不知道什么是位移,所以我可能会使用 24 位解决方案,但是如果没有原始类型是 24 位,你如何获得 24 位。
  • 你使用 3 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多