java - 将我的 C++ Base64 代码翻译成 Java 不工作

标签 java c++

我正在尝试将我的 C++ 代码移植到 Java,但遇到了困难。 Java 部分无法正常工作,但 C++ 部分可以。

我得到:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6 at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:870) at java.lang.StringBuilder.substring(StringBuilder.java:72) at Foo.Encryption.EncodeB64(Encryption.java:57) at Foo.Main.main(Main.java:9) Java Result: 1

该行指向:System.out.println(Base64Chars.charAt(BinToDecStr(Binaries.substring(0, 6))));

C++ 代码(100% 有效):

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <cmath>

const std::string Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

std::string DecToBinStr(int Num, int Padding)
{
    int Bin = 0, Pos = 1;
    std::stringstream SS;
    while (Num > 0)
    {
        Bin += (Num % 2) * Pos;
        Num /= 2;
        Pos *= 10;
    }
    SS.fill('0');
    SS.width(Padding);
    SS << Bin;
    return SS.str();
}

int BinToDecStr(std::string BinNumber)
{
    int Dec = 0;
    int Bin = strtol(BinNumber.c_str(), NULL, 10);

    for (int I = 0; Bin > 0; I++)
    {
        if(Bin % 10 == 1)
        {
            Dec += (1 << I);
        }
        Bin /= 10;
    }
    return Dec;
}

std::string EncodeB64X(std::string StringToEncode)
{
    std::string Binaries, Result;
    std::size_t STE_Size = StringToEncode.size();
    if(STE_Size)
    {
        for (std::size_t I = 0; I < STE_Size; I++)
            Binaries += DecToBinStr(int(StringToEncode[I]), 8);

        while(Binaries.size())
        {
            Result += Base64Chars[BinToDecStr(Binaries.substr(0, 6))];
            Binaries.erase(0, 6);
        }
    }
    return Result;
}

std::string DecodeB64X(std::string StringToEncode)
{
    std::string Binaries, Result;
    std::size_t STE_Size = StringToEncode.size();
    if(STE_Size)
    {
        for (std::size_t I = 0; I < STE_Size - 1; I++)
            Binaries += DecToBinStr(Base64Chars.find(StringToEncode[I]), 6);
        Binaries += DecToBinStr(Base64Chars.find(StringToEncode[STE_Size - 1]), 8 - ((STE_Size - 1) * 6) % 8);

        while(Binaries.size())
        {
            Result += char(BinToDecStr(Binaries.substr(0, 8)));
            Binaries.erase(0, 8);
        }
    }
    return Result;
}

int main()
{
    std::string F = EncodeB64X("Just Testing");
    std::cout<<F;
}

现在我试图将它翻译成 java,但它不起作用 :S。 这是java代码:

public class BaseEncoder
{
    private static final String Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    boolean IsBase64(byte C) {
        return (Character.isDigit(C) || (C == '+') || (C == '/') || Character.isAlphabetic(C));
    }

    private String PadLeft(String s, int n) {
        StringBuilder SBuff = new StringBuilder();
        for (int I = n - s.length(); I > 0; --I) {
            SBuff.append('0');
        }
        SBuff.append(s);
        return SBuff.toString();
    }

    private int BinToDecStr(String BinNumber) {
        int Dec = 0;
        int Bin = Integer.parseInt(BinNumber);

        for (int I = 0; Bin > 0; ++I) {
            if(Bin % 10 == 1) {
                Dec += (1 << I);
            }
            Bin /= 10;
        }
        return Dec;
    }

    private String DecToBinStr(int Num, int Padding) {
        int Bin = 0, Pos = 1;
        String SS = new String();
        while (Num > 0) {
            Bin += (Num % 2) * Pos;
            Num /= 2;
            Pos *= 10;
        }
        SS = PadLeft(SS, Padding);
        SS += Bin;
        return SS;
    }

    String EncodeB64(String StringToEncode)
    {
        String Result = new String();
        StringBuilder Binaries = new StringBuilder();
        int STE_Size = StringToEncode.length();
        if (STE_Size > 0) {
            for (int I = 0; I < STE_Size; ++I) {
                Binaries.append(DecToBinStr(StringToEncode.charAt(I), 8));
            }

            while(Binaries.length() > 0) {
                System.out.println(Base64Chars.charAt(BinToDecStr(Binaries.substring(0, 6))));
                Result += Base64Chars.charAt(BinToDecStr(Binaries.substring(0, 6)));
                Binaries.delete(0, 6);
            }
        }
        return Result;
    }

    String DecodeB64(String StringToEncode)
    {
        String Result = new String();
        StringBuilder Binaries = new StringBuilder();
        int STE_Size = StringToEncode.length();
        if(STE_Size > 0) {
            for (int I = 0; I < STE_Size - 1; I++) {
                Binaries.append(DecToBinStr(Base64Chars.indexOf(StringToEncode.charAt(I)), 6));
            }
            Binaries.append(DecToBinStr(Base64Chars.indexOf(StringToEncode.charAt(STE_Size - 1)), 8 - ((STE_Size - 1) * 6) % 8));

            while(Binaries.length() > 0) {
                Result += (char)BinToDecStr(Binaries.substring(0, 8));
                Binaries.delete(0, 8);
            }
        }
        return Result;
    }
}

知道我在 Java 中做错了什么吗?

最佳答案

std::string 中的

substr(0,n) 将返回少于 n 个字符,如果 n大于字符串的长度。在 Java 中,substring 在这种情况下会引发异常。您需要确保 n 不长于字符串的长度(类似于 str.substring(0, Math.min(6, str.length())).

关于java - 将我的 C++ Base64 代码翻译成 Java 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12811671/

相关文章:

c++ - 返回对象时 ctor/dtor 的顺序

java - 只为 servlet 调用的过滤器

java - 我试图在这里移动 SDK 中获取手势,但不明白要传递给手势方法的内容是什么?如何解决这个问题

c++ - 智能感知自动转换(点到箭头)

c++ - 如何防止多播套接字接收单播数据

c++ - 如何在 Ubuntu 的后台进程中获取数据

c++ - Jsoncpp 错误地写入浮点值

java - 读取 number.txt 文件并查找平均值

java - 将 xml 膨胀到 LinearLayout 后,图像按钮 src 图像消失了

java - 在 Camel 中提取路由统计信息