'use client' import { useState, useRef, useEffect } from 'react' interface DecodedLine { content: string isError: boolean } export default function DecodePage() { const [decodedLines, setDecodedLines] = useState([]) const [errorMessage, setErrorMessage] = useState('') const resultRef = useRef(null) // 转换 Unix 时间戳为本地时间字符串 const formatTimestamp = (line: string): string => { const match = line.match(/^\[(\d+)\](.*)/) if (match) { const timestamp = parseInt(match[1]) const date = new Date(timestamp * 1000) const formattedTime = date.toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }) return `[${formattedTime}]${match[2]}` } return line } const decodeBase64 = (base64String: string): string => { try { const binaryString = atob(base64String.trim()) const bytes = new Uint8Array(binaryString.length) for (let i = 0; i < binaryString.length; i++) { bytes[i] = binaryString.charCodeAt(i) } const decoder = new TextDecoder('utf-8') return decoder.decode(bytes) } catch (e) { throw new Error(`解码失败: ${(e as Error).message}`) } } const scrollToBottom = () => { if (resultRef.current) { resultRef.current.scrollTop = resultRef.current.scrollHeight } } // 当解码行数更新时滚动到底部 useEffect(() => { if (decodedLines.length > 0) { setTimeout(scrollToBottom, 100) } }, [decodedLines]) const handleFileChange = async (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (!file) { setErrorMessage('请选择文件') return } try { const text = await file.text() const lines = text.split('\n') const processedLines: DecodedLine[] = lines .filter(line => line.trim()) .map((line, index) => { try { const decodedLine = decodeBase64(line) const formattedLine = formatTimestamp(decodedLine) return { content: formattedLine, isError: false } } catch (e) { console.error(`第 ${index + 1} 行解码失败:`, e) return { content: `第 ${index + 1} 行解码失败: ${line}`, isError: true } } }) setDecodedLines(processedLines) setErrorMessage('') } catch (e) { setErrorMessage('文件读取失败,请重试') console.error('文件读取错误:', e) } } return (

Base64 日志解码器

{/* 文件上传区域 */}
{/* 错误提示 */} {errorMessage && (
{errorMessage}
)} {/* 解码结果 */} {decodedLines.length > 0 && (

解码结果:

{decodedLines.map((line, index) => (
                    {line.content}
                  
))}
)}
) }