มีวิธีใน C # เพื่อดูว่าสตริงที่เข้ารหัส Base 64 นอกเหนือจากการพยายามแปลงและดูว่ามีข้อผิดพลาดหรือไม่? ฉันมีรหัสโค้ดดังนี้:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
ฉันต้องการหลีกเลี่ยงข้อยกเว้น "อักขระไม่ถูกต้องในสตริงฐาน 64" ที่เกิดขึ้นหากค่าไม่ใช่สตริง 64 ฐานที่ถูกต้อง ฉันต้องการตรวจสอบและส่งคืนเท็จแทนการจัดการข้อยกเว้นเพราะฉันคาดว่าบางครั้งค่านี้จะไม่เป็นสตริง 64 ฐาน มีวิธีตรวจสอบก่อนใช้ฟังก์ชัน Convert.FromBase64String หรือไม่?
ขอบคุณ!
อัปเดต:
ขอบคุณสำหรับคำตอบทั้งหมดของคุณ นี่คือวิธีการขยายที่คุณสามารถใช้ได้จนถึงตอนนี้ดูเหมือนว่าสตริงของคุณจะผ่าน Convert.FromBase64String โดยไม่มีข้อยกเว้น .NET ดูเหมือนจะละเว้นช่องว่างต่อท้ายและสิ้นสุดทั้งหมดเมื่อแปลงเป็น 64 ฐานดังนั้น "1234" จึงถูกต้องและเป็น "1234"
public static bool IsBase64String(this string s)
{
s = s.Trim();
return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
สำหรับผู้ที่สงสัยเกี่ยวกับประสิทธิภาพของการทดสอบเทียบกับการจับและข้อยกเว้นในกรณีส่วนใหญ่สำหรับสิ่งพื้นฐาน 64 นี้จะตรวจสอบได้เร็วกว่าที่จะจับข้อยกเว้นจนกว่าคุณจะถึงระยะเวลาที่กำหนด ยิ่งเล็กความยาวเร็วเท่าไหร่
ในการทดสอบที่ไม่เป็นไปตามหลักวิทยาศาสตร์ของฉัน: สำหรับการทำซ้ำ 10,000 ครั้งสำหรับความยาวอักขระ 100,000 - 110000 การทดสอบก่อนนั้นเร็วกว่า 2.7 เท่า
สำหรับการทำซ้ำ 1,000 ครั้งสำหรับความยาวอักขระ 1-16 อักขระสำหรับการทดสอบทั้งหมด 16,000 ครั้งจะเร็วขึ้น 10.9 เท่า
ฉันแน่ใจว่ามีจุดที่ดีกว่าในการทดสอบด้วยวิธีการตามข้อยกเว้น ฉันไม่รู้ว่าจุดนั้นคืออะไร
\n\fLE16
- วิธีของคุณจะให้ผลบวกเท็จสำหรับสิ่งนี้ สำหรับใครที่อ่านและกำลังมองหาวิธีที่เข้าใจผิด ฉันจะแนะนำจับ FormatException หรือใช้ข้อมูลจำเพาะเหมาะ RegEx ดูstackoverflow.com/questions/475074/...
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
เครื่องหมาย หากช่องว่างภายในไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดแม้ว่าอินพุตจะตรงกับนิพจน์ก็ตาม