【问题标题】:String of 1's & 0's into Raw Data原始数据中的 1 和 0 字符串
【发布时间】:2012-11-21 02:38:06
【问题描述】:

我有一个在正文中包含随机 1 和 0 的网页,我想将其视为原始二进制数据并将其保存到文件中。

<html>
    <head>...</head>
        <pre style="word-wrap: break-word; white-space: pre-wrap;">1 0 1 0 1 1 1 1 1 0</pre>
    </body>
</html>

或者,我可以在一列中获取文件。如果我只是 url.openStream() 并读取字节,它会吐出 ascii 值(49 和 48)。我也不确定如何一次将一位写入文件。我该怎么做?

【问题讨论】:

  • 撇开迂腐:你所描述的不能真正称为“处理原始二进制数据”——因为你正在处理字符 '1''0';
  • 您的数据压缩率为 128(假设您的文本编码为 8 位/字符)...这意味着以您的格式存储 1kb 数据会将其“压缩”为 128kb。考虑从文件系统中读取实际的二进制数据(压缩比为 1)。当您将数据读入实际的二进制数据时,您还可以避免大量的位移和 ORing...
  • @Robert Rouhani 您刚刚重申了我正在尝试做的事情,我无法从二进制页面中读取。它只会给我ascii值。如何将文本读取为二进制数据?使用 BufferedReader 我什至不能用 " " 分割行,它只会给我一个包含整行的条目数组。
  • @user1684045 你为什么首先从页面上阅读?文件上传控制会更容易。
  • 为什么每个人都认为我可以进入文件系统?我所能得到的正是我所描述的,一个带有ascii 1和0的页面......

标签: java string file binary


【解决方案1】:

1 0 1 0 1 1 1 1 1 0

这可以作为两个(base64)或三个(十六进制)字节发送,所以我假设效率在这里不是问题。 ;) 提取字符串后,您可以使用它进行转换。

String s = "1 0 1 0 1 1 1 1 1 0";
long l = Long.parseLong(s.replaceAll(" ", ""), 2);

【讨论】:

  • 这将解析到63位没问题,如果您需要更多使用BigInteger
【解决方案2】:

您可以将位读入字节,然后将字节写入文件:

int byteIndex = 0;
int currentByte = 0;
while (hasBits) {
    String bit = readBit();
    currentByte = currentByte << 1 | Integer.valueOf(bit);
    if (++byteIndex == 8) {
        writeByte(currentByte);
        currentByte = 0;
        byteIndex = 0;
    }
}

// write the rest of bits here

我也同意 Robert Rouhani,这是一种非常低效的数据传输方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2016-01-01
    • 2019-02-22
    • 2020-02-06
    相关资源
    最近更新 更多