编码 Base64 找不到符号错误

Posted

技术标签:

【中文标题】编码 Base64 找不到符号错误【英文标题】:Encode Base64 cannot find symbol error 【发布时间】:2017-02-04 06:52:10 【问题描述】:

当我尝试在终端中编译它时,它给了我一个错误。它打印出这个错误:

-bash-4.1$ javac CPS3498/HW_Ch2/encrypt.java
CPS3498/HW_Ch2/encrypt.java:9: cannot find symbol
symbol  : class Base64
location: package java.util
import java.util.Base64;
                ^
CPS3498/HW_Ch2/encrypt.java:61: cannot find symbol
symbol  : variable Base64
location: class encrypt
        String encryptedValue = Base64.getEncoder().encodeToString(encVal);
                                ^
2 errors

我完全不知道如何解决这个问题。我尝试了不同的 java 实用程序进行编译,它们都给了我几乎相同的错误。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

//create public class encrypt
public class encrypt 
    //algorithm AES 128 with a secret key
    private static final String ALGO = "AES";
    private static final byte[] keyValue = 
        new byte[]  'H', 't', 'v', 'b', 'a', 'w', 'e',
'i', 'n', 'v', 'a','l', 't', 'k', 'y', 'e' ;
    private static BufferedReader reader;

    public static void main(String[] args) throws Exception 
        //Filereader letter to read from a file letter.txt
        FileReader letter = new FileReader("/Users/Shiv/Eclipse/CPS3498_HW/src/letter.txt");
        reader = new BufferedReader(letter);
        //string text blank, data that stres reader contents.
        String text = "";
        String data = reader.readLine();
        //while loop to see if data is not blank
        while (data != null)
            text += data;
            data = reader.readLine();
        
        String textEnc = encrypt(text);
        //        
        File secret = new File("/Users/Shiv/Eclipse/CPS3498_HW/src/secret.txt");
            try
            
                secret.createNewFile();
            
            catch(Exception e)
            
                e.printStackTrace();
                       
            try 
                FileWriter secretFile = new FileWriter(secret);
                BufferedWriter secretBuff = new BufferedWriter(secretFile);
                secretBuff.write(textEnc);
                secretBuff.close();
             
            catch (Exception e) 
            
                e.printStackTrace();
            
        
//encrypt method
public static String encrypt(String Data) throws Exception 
        Key pass = generateKey();
        // cipher class to provide the encryption and intialize
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, pass);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = Base64.getEncoder().encodeToString(encVal);
        return encryptedValue;     
    
//generateKey method to generate a secret key
private static Key generateKey() throws Exception 
    Key pass = new SecretKeySpec(keyValue, ALGO);
    return pass;


【问题讨论】:

输入命令java -version。版本至少需要为 1.8.0。调整您的 PATH 以指向 Java 1.8 JDK 并使用另一个 java -version 进行验证。 ***.com/questions/14413169/… 【参考方案1】:

java.util.Base64 从 Java 8 开始可用。您正在使用较旧的 Java 版本编译该类。 javac -version 会告诉你你正在使用哪一个。

【讨论】:

我使用的是eve服务器,默认java版本是1.6.0_26。有什么办法可以更新java版本 @ShivPatel 我不熟悉 Eve,这是一个完全不同的问题。您需要使用 Java 8 编译源代码才能使用 java.util.Base64,并且您需要在计划运行应用程序的服务器上安装 Java 8 运行时。 问题是我无法在服务器上安装 Java 8 运行时,因为它是我在学校使用的服务器。有没有办法使用 java 1.6 版进行解密和加密。【参考方案2】:

源代码:Which Java library provides base64 encoding/decoding?

Java 6 和 7

从 Java 6 开始,您可以使用鲜为人知的类 javax.xml.bind.DatatypeConverter。这是 JRE 的一部分,不需要额外的库。

byte[] message = "hello world".getBytes("UTF-8");
String encoded = DatatypeConverter.printBase64Binary(message);
byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);

System.out.println(encoded);
System.out.println(new String(decoded, "UTF-8"));

输出

aGVsbG8gd29ybGQ= 你好世界

【讨论】:

【参考方案3】:

尽管在 jdk1.8.0_181 上运行,但我遇到了同样的问题。

我让它与以下代码一起工作:

import java.util.Base64;

...

byte[] encodedPv = Base64.getDecoder().decode(PRIVATE_KEY);

...

希望这对某人有所帮助! 干杯Manzn

【讨论】:

【参考方案4】:

这确实是使用比版本 8 更旧的 Java SDK 的问题。

在某些操作系统中,确定实际使用的编译器/SDK 版本可能很棘手。

可以通过以下命令获取当前配置的编译器版本:

javac -version 

这应该返回 1.8 或更高版本。

//edit:java.util.Base64 在 JDK 8 和更新版本中可用。所以确定javac的使用版本真的很有帮助。

【讨论】:

以上是关于编码 Base64 找不到符号错误的主要内容,如果未能解决你的问题,请参考以下文章

RowCategoryBinding 找不到符号

经典的找不到符号(symbol)错误

找不到符号Maven打包找不到符号的问题排查

Xcode 8:找不到用于 pod 的架构 arm64 的符号

为啥当代码编译正常并设置类路径时找不到base64类

java 中 “找不到符号”的错误