当前位置: 首页 > 知识库问答 >
问题:

Java膨胀与大字符串不一致

郝永思
2023-03-14
public String compress(String s){
    Deflater def = new Deflater(9);
    byte[] buffer = new byte[s.length()];
    String rta = "";
    def.setInput(s.getBytes());
    def.finish();
    def.deflate(buffer);
    rta = new String(buffer);
    rta = rta.trim().concat("*" + Integer.toString(s.length()));
  //this addition at the end is used to recover the original length of the string to dynamically create the buffer later on.
    return rta;
}
public String decompress(String s){
    String rta = "";
    Inflater inf = new Inflater();
    byte[] buffer = separoArray(s, true).getBytes(); // This function returns the compressed string or the original length wheter true/false parameter
    int len = Integer.valueOf(separoArray(s, false));
    byte[] decomp = new byte[len];
    inf.setInput(buffer);
    try {
        inf.inflate(decomp, 0, len);
        inf.end();
    } catch (DataFormatException e) {e.printStackTrace();}
    rta = new String(decomp);
    return rta;
}

原件:

“lorem ipsum dolor sit amet,consectetur adipiscing elit.Sed rutrum imperdiet versit.Nulla eu sapien tincidunt,pellentesque ipsum in,lucuts eros.Nullam tristique arcu lorem,at fringilla lectus tincidunt sit amet.Ut tortor dui,cursus at erat non,interdum imperdiet odio.in hac habitasse platea dicumst.Nullam eu sapien tincidunt.Duis eget auctor nibh小腹毛(mauris scelerisque vulputatate.Fusce gravida appilisis ipsum pellentesque eismod.faucibus orci luctus et ultrices posuere cubilia curae.

解压:

“Lorem ipsuAdolor sit amet,consectetur adipiscing elit.Sed rutrsuAimperdiet versiat.Nulla eu sapien tincidunt,pellentesquem ipsuAin,lucuts eros.Nullam tristiquemarcu lLore,at fringilla lectus tincidunt sit amet.Ut tortor dui,cursus at erat non,interdsuAimperdiet odsAimpeIn hac abitasse platea dius ms Nulla euinpuisisi.Duierog c.msan orci.Morbi quierleodsmdmmausti sceleriuem ivulputate.Fusce gravideuuconpilisisipsuainllentesquem ieuiemod.VeiqubulAin erddpsuAinlrimisipnufaucubus orciuctor erot ulistcesmposuereursbilia cura”

差异是显而易见的,为什么会发生这种情况?,我可以做些什么来避免它?

谢谢你。

共有1个答案

杜昆琦
2023-03-14

我同意评论者的观点,压缩字符串最好是byte[]。但是,对于像ISO-8859-1这样的单字节编码,可能会在byte[]string之间进行错误的转换。

以下内容与您的版本不同,因为它显式地指示了编码。对于文本,UTF-8足以没有限制并覆盖完整的Unicode范围。

请注意deflate返回值的用法。

public static String compress(String s) {
    Deflater def = new Deflater(9);
    byte[] sbytes = s.getBytes(StandardCharsets.UTF_8);
    def.setInput(sbytes);
    def.finish();
    byte[] buffer = new byte[sbytes.length];
    int n = def.deflate(buffer);
    return new String(buffer, 0, n, StandardCharsets.ISO_8859_1)
            + "*" + sbytes.length;
}

public static String decompress(String s) {
    int pos = s.lastIndexOf('*');
    int len = Integer.parseInt(s.substring(pos + 1));
    s = s.substring(0, pos);
    
    Inflater inf = new Inflater();
    byte[] buffer = s.getBytes(StandardCharsets.ISO_8859_1);
    byte[] decomp = new byte[len];
    inf.setInput(buffer);
    try {
        inf.inflate(decomp, 0, len);
        inf.end();
    } catch (DataFormatException e) {
        throw new IllegalArgumentException(e);
    }
    return new String(decomp, StandardCharsets.UTF_8);
}
 类似资料:
  • 使用PDFBox可以读取livecycle创建的动态PDF。下面的代码读取然后写回用于创建动态PDF的xml文件。我有点担心,因为生成的文件很大,从647kb pdf开始。新的pdf 14000kb。任何人都知道如何减少生成的新文件的大小。写回pdf文件时可以设置某种类型的压缩吗?

  • 我试图将我的GLSurfaceView设置在xml布局以及其他UI元素上,并不断获得错误inflating类com.vi.cubo01。MyGLSurfaceView在LogCat. 以下是java代码: 以及xml:

  • 我在自定义控件中膨胀MvxImageView时遇到问题。 从我所做的研究中,我发现了几个嫌疑人 > < li >我是否应该将“如果”添加到“什么”中?(我看到这是关于android地图视图膨胀错误。 < li> 我创建的用户控件是不是都错了?我看到了一个使用SetContentView()而不是inflate的建议,因为它通过mvvmcross机制传递indlate请求,但在自定义视图中没有这样的

  • 有人知道如何成功编程这个简单的属性吗?占据整个窗口的网格窗格?我错过了什么? 谢谢LD

  • 问题内容: 您好,我是android dev和admob的新手。我正在尝试制作一个带有按钮,几个页面和底部的admob的简单测试应用程序。一切正常,直到我尝试实施admob。这是我的代码: HelloAndroid.java: main.xml: 您好android清单: logcat输出: 我正在使用GoogleAdMobAdsSdkAndroid-6.0.0。再次,我对此非常陌生,我尝试在多个

  • 我编写了一个APEX类,它在客户机发布时发送电子邮件。有一种方法,我认为我已经膨胀了,但我被告知它没有。这是因为此方法调用了另一个函数,该函数实际上执行实际的电子邮件创建,并且没有进行扩展。有人能告诉我如何从方法中提取SOQL查询吗? 我之所以尝试将其庞大化,是因为我编写了一个APEX调度器,每天早上7点调用resendemails方法,检查哪些记录需要发送电子邮件。我担心,如果有100多个客户,