使用每个Base64字符的句子

8
我试图构建一个句子/信件组合,以返回每个base64字符,但是找不到一个用于单元测试目的的词。
到目前为止,我所拥有的单元测试未能命中处理+和/字符的行。虽然我可以直接将它们投射到编码器/解码器上,但拥有一个可读性强的源代码(类似于“the quick brown dog”这样的base64等效代码)会更好。

嗯...我看到的问题是这个句子会很长,因此可能会打错字。如果您不想打字,而是复制粘贴,那么您可以使用任何适合的生成字符串。 - sharptooth
但是,如果您尝试向后工作并合并+和/字符,则会得到带有umlaut等字符或不可打印字符,这对于传递单元测试没有用处。 - graham.reeds
4个回答

10

这是一个Base64编码的测试字符串,其中包含所有64个可能的Base64符号:

char base64_encoded_test[] =
"U28/PHA+VGhpcyA0LCA1LCA2LCA3LCA4LCA5LCB6LCB7LCB8LCB9IHRlc3RzIEJhc2U2NCBlbmNv"
"ZGVyLiBTaG93IG1lOiBALCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBJLCBKLCBLLCBMLCBNLCBO"
"LCBPLCBQLCBRLCBSLCBTLCBULCBVLCBWLCBXLCBYLCBZLCBaLCBbLCBcLCBdLCBeLCBfLCBgLCBh"
"LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg==";

char base64url_encoded_test[] =
"U28_PHA-VGhpcyA0LCA1LCA2LCA3LCA4LCA5LCB6LCB7LCB8LCB9IHRlc3RzIEJhc2U2NCBlbmNv"
"ZGVyLiBTaG93IG1lOiBALCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBJLCBKLCBLLCBMLCBNLCBO"
"LCBPLCBQLCBRLCBSLCBTLCBULCBVLCBWLCBXLCBYLCBZLCBaLCBbLCBcLCBdLCBeLCBfLCBgLCBh"
"LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg==";

它解码为一个完全由相对易读的文本组成的字符串:
char test_string[] = "So?<p>"
    "This 4, 5, 6, 7, 8, 9, z, {, |, } tests Base64 encoder. "
    "Show me: @, A, B, C, D, E, F, G, H, I, J, K, L, M, "
    "N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \\, ], ^, _, `, "
    "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s.";

这个解码后的字符串仅包含isprint()可打印的7位ASCII字符范围内的字母(从空格到“~”)。

既然我做到了,我会认为这是可能的 :-).


我得在周末回家后再检查一下这个。 - graham.reeds
在你的测试字符串中,反斜杠\不需要转义,这让人感到惊讶。 - graham.reeds
哎呀。是的,如果我想把这个测试字符串放在我的源代码中(但不是从文件中读取),我需要将反斜杠加倍来转义它。已修复。 - David Cary
1
既然我做到了,我会认为这是可能的。哦,请不要忘了,如果没有至少一个回答声称“你不能/不应该这样做”,那就不是stackoverflow 了。 - username

1

在尝试编码/解码时,这是我违反单元测试一次只测试一个方法的规则的唯一情况。您可以分别使用编码或解码方法,但要确定是否正确,唯一的方法是在单个断言中同时使用编码和解码。我会使用以下伪代码。

Generate a random string using Path.GetRandomFilename() this string is cryptographically strong
Pass the string to the encode method
Pass the output of the encode to the decode method
Assert.AreEqual(input from GetRandomFilename, output from Decode)

你可以循环执行此操作任意次数,以确保它已经测试过。您还可以覆盖一些特定情况; 然而,由于编码有时基于字母的位置而有所不同,因此最好使用随机字符串并调用约50次encode/decode。
如果发现在接受的场景中编码/解码失败,请为其创建单元测试,并过滤包含这些字符/字符组合的字符串。同时,在XMLDocs注释、代码注释和应用程序的任何文档中记录这些故障。

我实际上正在使用来自RFC3548的一些长字符串。由于这只是英文文本,因此字符范围受到限制。 - graham.reeds

1
我想到的内容可能会有所帮助。需要按照原样输入:我包含一个链接,显示所有通常不可见字符的截图,以及它转换为的Base64数据字符串和相关统计信息的表格,其中包括64个字符的每个字符的相关统计信息。
            <HTML><HEAD></HEAD><BODY><PRE>
            Did 

             THE    

              THE QUICK BROWN FOX   

               jump 

                over    

                 the    

                  lazy  

                   dogs 

                    or  

                     was    

                      he    

                       pushed   

                        ?   

            </PRE><B>hmm.</B></BODY><HTML>






            ÿß®Þ~c*¯/

这将被编码为Base64字符串:

            PEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPjxQUkU+DQpEaWQJDQoNCiBUSEUJDQoNCiAgVEhFIFFVSUNLIEJST1dOIEZPWAkNCg0KICAganVtcAkNCg0KICAgIG92ZXIJDQoNCiAgICAgdGhlCQ0KDQogICAgICBsYXp5CQ0KDQogICAgICAgZG9ncwkNCg0KICAgICAgICBvcgkNCg0KICAgICAgICAgd2FzCQ0KDQogICAgICAgICAgaGUJDQoNCiAgICAgICAgICAgcHVzaGVkCQ0KDQogICAgICAgICAgICA/CQ0KDQo8L1BSRT48Qj5obW0uPC9CPjwvQk9EWT48SFRNTD4NCg0KDQoNCg0KDQoNCg//367efmMqry/==

包含

的内容是
            5--/'s
            4--+'s
            3--='s
            14--0's
            3--1's
            3--2's
            2--3's
            4--4's
            3--5's
            2--6's
            2--7's
            4--8's
            6--9's
            5--a's
            27--A's
            2--b's
            5--B's
            5--c's
            4--C's
            4--d's
            14--D's
            2--e's
            10--E's
            2--f's
            8--F's
            36--g's
            6--G's
            5--h's
            2--H's
            5--i's
            30--I's
            5--j's
            6--J's
            8--k's
            12--K's
            2--l's
            3--L's
            2--m's
            4--M's
            3--n's
            14--N's
            13--o's
            2--O's
            3--p's
            9--P's
            2--q's
            24--Q's
            2--r's
            5--R's
            2--s's
            6--S's
            2--t's
            7--T's
            2--u's
            1--U's
            3--v's
            6--V's
            4--w's
            5--W's
            3--x's
            6--X's
            2--y's
            4--Y's
            3--z's
            5--Z's

1

你可能做不到那个。

/ 在 base64 编码中表示 111111(6 个 '1' 位)。

由于所有 ASCII 字符(即可输入和可打印字符)都在 0-127 的范围内(即 0000000001111111),因此唯一可以使用 '/' 进行编码的 ASCII 字符是代码为 127 的 ASCII 字符,即不可打印的 DEL 字符。

如果允许使用高于 127 的值,则可以得到可打印但不可输入的字符串。


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