Junit测试基于Base64编码的字符串

5

我正在尝试使用Apache的PDFBox读取PDF内容,并将其编码为base64以便流式传输到其他地方。为了进行编码,我使用Apache Commons Base64OutputStream类。代码如下:

ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
Base64OutputStream base64Output = new Base64OutputStream(byteOutput);
List pages = pdfDocument.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while (iter.hasNext()) {
  PDPage page = (PDPage) iter.next();
  PDResources resources = page.getResources();
  Map<String, PDXObjectImage> pageImages = resources.getImages();
  if (pageImages != null) {
    Iterator imageIter = pageImages.keySet().iterator();
    while (imageIter.hasNext()) {
      String key = (String) imageIter.next();
      PDXObjectImage image = (PDXObjectImage) pageImages
          .get(key);
      image.write2OutputStream(base64Output);
    }
  }
}
String base64 = new String(byteOutput.toByteArray());

看起来是在进行编码,但我需要编写一个Junit测试来验证base64字符串。以下内容似乎无法通过测试。有什么想法吗?

assertTrue(content
        .matches("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$"));

Thanks in advance


1
使用Apache Common的"assertTrue(Base64.isBase64(content));"似乎完全正常。有人能否解释一下为什么正则表达式不起作用? - nixgadget
那个正则表达式对我有效,我尝试编写了一个小的Java存根来测试它。它在Java 6和Java 7中都可以成功编译和运行。 https://gist.github.com/melwil/5508003 - melwil
1
也许你遇到了换行符?或者缺少了 = 的填充?可能在 HTTP 传输中,+ 被翻译为空格。 - Joop Eggen
1个回答

3
默认情况下,Base64OutputStream 使用 CHUNK_SIZE = 76 和 CHUNK_SEPARATOR = {'\r', '\n'}。您使用的正则表达式测试给定字符串是否为 BASE64 编码时没有考虑到这一点。
匹配分块 BASE64(使用给定的块大小 64 和分隔符 \r\n)字符串的正则表达式可能如下所示:
"^(([\\w+/]{4}){19}\r\n)*(([\\w+/]{4})*([\\w+/]{4}|[\\w+/]{3}=|[\\w+/]{2}==))$"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接