4

根据 VCard 3 格式的 RFC 2426,http ://www.ietf.org/rfc/rfc2426.txt (第 2.4.1 节)

长行的编码二进制数据应该使用 [MIME-DIR] 中定义的折叠方法折叠为 75 个字符。

但是,根据 mime 规范(即 commons、migbase64 等),我看到的每个编码器都折叠为 76 个字符,并且我发现允许指定行长的编码器提到“行长应该是 4 的倍数”。

是否有允许以 75 个字符折叠的 java 库?老实说,我应该担心“应该”而不是“必须”吗?

4

3 回答 3

1

看了一圈base64编码器后,我又回到了rfc,经过一番重新思考,我认为base64编码器不需要折叠线。

当它谈到数据的 base64 编码时,它提到了折叠:

2.4.1 BINARY
[...]Long lines of encoded binary data SHOULD BE folded to 75 characters
using the folding method defined in [MIME-DIR]

然后在 2.6 中再次提到折叠

2.6 Line Delimiting and Folding
[...]   After generating a content line,
lines longer than 75 characters SHOULD be folded according to the
folding procedure described in [MIME DIR].

内容行定义为

contentline  = [group "."] name *(";" param ) ":" value CRLF

(重要的是它是“全线”而不仅仅是折叠的值)

在查看 2.4.1 时,它暗示二进制编码应该折叠行,但这似乎与内容行折叠本身(2.6)竞争。

如果同时应用了二进制数据折叠和行折叠,那么会发生“双重折叠” ,我认为这不是有意的。(因为我知道有些人会提到这些例子不是 75 个字符长.. 假装它们是 .. 谢谢)即

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY <= line folded
MIICajCCAdOgAwI   <=folded at 75 binary chars as per binary folding
kU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2HNBr1B+GNO9fi75e  <= line folded
[...]

更合理的解释是预期的输出是:

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY <=folded as per line folding
MIICajCCAdOgAwIkU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2H <=folded as per line folding
NBr1B+GNO9fi75e[...]

我相信 2.4.1 基本上只是重申了 2.6 的文件夹要求,如果正确则意味着不需要 75 行的 base64 编码器,因为 vcard 本身的基本行折叠将达到预期的结果。

因此,除非被证明是错误的,否则我现在将采用这种解释。

于 2012-07-31T21:26:49.603 回答
0

我不认为折叠线长度真的很重要。你可能完全不折叠你的线条而侥幸逃脱。但是规范推荐了它,因此可能有一些应用程序期望这些线被折叠。

如果您不想使用默认的 75 个字符,ez-vcard允许您手动定义每行的最大长度。

VCard vcard = new VCard();

byte[] photoBytes = ...
PhotoType photo = new PhotoType(photoBytes, ImageTypeParameter.JPEG);
vcard.addPhoto(photo);

Writer writer = ...
VCardVersion version = VCardVersion.V3_0;
FoldingScheme foldingScheme = new FoldingScheme(76, " ");
VCardWriter vcr = new VCardWriter(writer, version, foldingScheme);
vcr.write(vcard);
vcr.close();

关于您提到的“双重折叠”,您的假设是正确的。这不是二进制数据的折叠方式。首先,将二进制数据转换为base64,然后折叠base64字符串。

此外,请记住所有折叠行必须以至少一个空格字符开头。在下面的示例中,请注意第二行和第三行如何以空格开头。

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY
 MIICajCCAdOgAwIkU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2
 NBr1B+GNO9fi75e
于 2012-11-01T23:47:09.283 回答
0

我为 XML-RPC 客户端编写了 base64 编码/解码。你可以在github上找到它。它在 MIT 下获得许可,所以你可以把这个类拿出来并在你的项目中使用它。要调整线宽,您只需编辑第 111 行

我不知道你是否必须或应该坚持线路长度,但既然你可以坚持,我会这样做:)

于 2012-07-27T09:28:45.577 回答