पायथन: बेस 64 डिकोडिंग के दौरान 'गलत पेडिंग' त्रुटि को अनदेखा करें


111

मेरे पास कुछ डेटा है जो कि बेस 64 एनकोडेड है जिसे मैं बाइनरी में बदलना चाहता हूं, भले ही उसमें कोई पेडिंग एरर हो। अगर मैं उपयोग करता हूं

base64.decodestring(b64_string)

यह एक 'गलत पेडिंग' त्रुटि उठाता है। क्या कोई और तरीका है?

अद्यतन: सभी प्रतिक्रिया के लिए धन्यवाद। सच कहूं, तो सभी तरीकों का उल्लेख थोड़ा हिट और मिस लग रहा था इसलिए मैंने ओपनसेल की कोशिश करने का फैसला किया। निम्नलिखित कमांड ने एक उपचार किया:

openssl enc -d -base64 -in b64string -out binary_data

5
क्या आपने वास्तव में TRY का उपयोग किया है base64.b64decode(strg, '-_')? यह एक प्राथमिकता है, जब आप किसी भी नमूना डेटा की आपूर्ति करने की जहमत उठाए बिना, आपकी समस्या का सबसे संभावित पायथन समाधान है। प्रस्तावित "तरीके" DEBUG के सुझाव थे, NECESSARILY ने "हिट एंड मिस" की आपूर्ति की जानकारी की शुद्धता दी।
जॉन माचिन

2
@ जॉन माचिन: ​​हाँ, मैंने आपकी विधि की कोशिश की, लेकिन यह काम नहीं किया। डेटा कंपनी का गोपनीय है।
फनलोविनकोडर

3
कोशिशbase64.urlsafe_b64decode(s)
डैनियल एफ

क्या आप इसका आउटपुट प्रदान कर सकते हैं: sorted(list(set(b64_string)))कृपया? कुछ भी कंपनी-गोपनीय खुलासा किए बिना, यह बताना चाहिए कि मूल डेटा को एन्कोड करने के लिए किन वर्णों का उपयोग किया गया था, जो बदले में गैर-हिट या मिस-मिस समाधान प्रदान करने के लिए पर्याप्त जानकारी की आपूर्ति कर सकते हैं।
ब्रायन कारिच

हां, मुझे पता है कि यह पहले से ही हल है, लेकिन, ईमानदार होने के लिए, ओपनसेल समाधान भी मुझे हिट-या-मिस लगता है।
ब्रायन कारिच

जवाबों:


79

जैसा कि अन्य प्रतिक्रियाओं में कहा गया है, ऐसे कई तरीके हैं जिनसे आधार 64 डेटा को दूषित किया जा सकता है।

हालाँकि, जैसा कि विकिपीडिया कहता है, बेसिंग एन्कोडेड डेटा के अंत में पैडिंग ('=' अक्षर) को हटाना "दोषरहित" है:

सैद्धांतिक दृष्टिकोण से, पेडिंग चरित्र की आवश्यकता नहीं है, क्योंकि लापता बाइट्स की संख्या की गणना बेस 64 अंकों की संख्या से की जा सकती है।

तो अगर यह वास्तव में आपके बेस 64 डेटा के साथ केवल "गलत" है, तो पैडिंग को वापस जोड़ा जा सकता है। मैं इसके साथ WeasyPrint में "डेटा" URL पार्स करने में सक्षम हुआ, जिनमें से कुछ बिना आधार के आधार पर थे:

import base64
import re

def decode_base64(data, altchars=b'+/'):
    """Decode base64, padding being optional.

    :param data: Base64 data as an ASCII byte string
    :returns: The decoded byte string.

    """
    data = re.sub(rb'[^a-zA-Z0-9%s]+' % altchars, b'', data)  # normalize
    missing_padding = len(data) % 4
    if missing_padding:
        data += b'='* (4 - missing_padding)
    return base64.b64decode(data, altchars)

इस समारोह के लिए टेस्ट: वीसप्रिंट / टेस्ट / test_css.py # L68


2
नोट: ASCII यूनिकोड नहीं है, इसलिए सुरक्षित रहने के लिए, आप चाहते होंगेstr(data)
मार्कहु नो

4
यह एक चेतावनी के साथ अच्छा है। base64.decodestring को हटा दिया गया है, base64.b64_decode का उपयोग करें
ariddell

2
@ 3 पर @ariddell टिप्पणी को स्पष्ट करने के base64.decodestringलिए base64.decodebytes, लेकिन उपयोग करने के लिए बेहतर संस्करण संगतता के लिए पदावनत किया गया है base64.b64decode
कैस

क्योंकि base64मॉड्यूल इनपुट में अमान्य गैर-आधार 64 वर्णों को अनदेखा करता है, आपको पहले डेटा को सामान्य करना होगा। कुछ भी निकालें जो एक अक्षर, अंक /या नहीं है +, और फिर गद्दी जोड़ें।
मार्टिन पीटर्स

39

आवश्यकतानुसार पैडिंग लगाएं। हालांकि, माइकल की चेतावनी है।

b64_string += "=" * ((4 - len(b64_string) % 4) % 4) #ugh

1
वहाँ निश्चित रूप से कुछ सरल है कि 0 0 करने के लिए नक्शे, 2 1 और 1 2. करने के लिए
बी ए डी पी

2
आप 4 के बजाय 3 के कई में क्यों विस्तार कर रहे हैं?
माइकल Mrozek

बेस 64 पर विकिपीडिया लेख का अर्थ है।
badp

1
@ बीपी: बेस 24 में प्रत्येक 24 बिट्स (3 बाइट्स) को बाइनरी इनपुट में 4 बाइट्स आउटपुट के रूप में एन्कोड किया गया है। output_len% 3 का कोई मतलब नहीं है।
जॉन मैकिन

8
बस ===काम करना हमेशा काम आता है। किसी भी अतिरिक्त =वर्ण को पायथन द्वारा सुरक्षित रूप से खारिज कर दिया जाता है।
एक्यूमेनस

32

ऐसा लगता है कि आपको डिकोडिंग से पहले बस अपने बाइट्स में पैडिंग जोड़ना होगा। इस सवाल पर कई अन्य उत्तर हैं, लेकिन मैं यह बताना चाहता हूं कि (कम से कम पायथन 3.x में) base64.b64decodeकिसी भी अतिरिक्त पैडिंग को कम कर देगा, बशर्ते कि पहले स्थान पर पर्याप्त हो।

तो, कुछ इस तरह से: के b'abc='रूप में अच्छी तरह से काम करता है b'abc=='(जैसा करता है b'abc=====')।

इसका मतलब यह है कि आप केवल अधिकतम पेडिंग वर्ण जोड़ सकते हैं, जिनकी आपको कभी आवश्यकता b'==='होगी- जो कि तीन है ( और-बेस 64) किसी भी अनावश्यक को काट देगा।

यह आपको लिखने देता है:

base64.b64decode(s + b'===')

जो की तुलना में सरल है:

base64.b64decode(s + b'=' * (-len(s) % 4))

1
ठीक है कि बहुत "बदसूरत" धन्यवाद नहीं है :) वैसे मुझे लगता है कि आपको 2 से अधिक पैडिंग चार्ट की कभी आवश्यकता नहीं है। Base64 एल्गोरिथ्म एक समय में 3 वर्णों के समूहों पर काम करता है और केवल तभी पैडिंग की आवश्यकता होती है जब आपके पिछले चार वर्णों की लंबाई केवल 1 या 2 वर्ण हो।
ओट्टो

@ यहां पेडिंग डीकोडिंग के लिए है, जो 4 वर्णों के समूहों पर काम करता है। बेस 64 एनकोडिंग 3 वर्णों के समूहों पर काम करता है :)
हेनरी वुडी

लेकिन अगर आप जानते हैं कि एन्कोडिंग के दौरान मैक्सिमम 2 कभी जुड़ जाएगा, जो बाद में "खो" हो सकता है, तो आपको डीकोडिंग से पहले उन्हें फिर से जोड़ने के लिए मजबूर करना होगा, तो आप जानते हैं कि आपको केवल डिकोडिंग के दौरान मैक्सिमम 2 को भी जोड़ना होगा। #ChristmasTimeArgumentForTheFunOfIt
ओटो

@ अब मैं मानता हूं कि आप सही हैं। जबकि एक base64 लंबाई के साथ एन्कोडेड स्ट्रिंग, उदाहरण के लिए, 5 को 3 पैडिंग वर्णों की आवश्यकता होगी, 5 की एक स्ट्रिंग भी एक base64 एन्कोडेड स्ट्रिंग के लिए एक वैध लंबाई नहीं है। आपको त्रुटि मिलेगी binascii.Error: Invalid base64-encoded string: number of data characters (5) cannot be 1 more than a multiple of 4:। इस पर ध्यान दिलाने के लिए धन्यवाद!
हेनरी वूडी

24

"गलत पैडिंग" का मतलब न केवल "लापता पैडिंग" हो सकता है, बल्कि यह भी माना जा सकता है कि "गलत पैडिंग" है।

यदि सुझाव दिया जाता है कि "पैडिंग जोड़ना" विधियाँ काम नहीं करती हैं, तो कुछ अनुगामी बाइट्स निकालने का प्रयास करें:

lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:
    result = base64.decodestring(strg[:lenx])
except etc

अपडेट: पैडिंग को जोड़ने या अंत से संभवतः खराब बाइट्स को हटाने के आसपास किसी भी तरह की फिडिंग को किसी भी व्हाट्सएप को हटाने के बाद किया जाना चाहिए, अन्यथा लंबाई गणना परेशान होगी।

यह एक अच्छा विचार है यदि आपने हमें डेटा का एक (छोटा) नमूना दिखाया है जिसे आपको पुनर्प्राप्त करने की आवश्यकता है। अपना प्रश्न संपादित करें और के परिणाम को कॉपी / पेस्ट करें print repr(sample)

अद्यतन 2: यह संभव है कि एन्कोडिंग एक url-safe तरीके से किया गया हो। यदि यह स्थिति है, तो आप अपने डेटा में माइनस और अंडरस्कोर वर्ण देख पाएंगे, और आपको उपयोग करके डिकोड करने में सक्षम होना चाहिएbase64.b64decode(strg, '-_')

यदि आप अपने डेटा में माइनस और अंडरस्कोर कैरेक्टर नहीं देख सकते हैं, लेकिन प्लस और स्लैश कैरेक्टर देख सकते हैं, तो आपको कुछ अन्य समस्या है, और ऐड-पेडिंग या रिमूवल-क्रॉफ्ट ट्रिक्स की आवश्यकता हो सकती है।

यदि आप अपने डेटा में माइनस, अंडरस्कोर, प्लस और स्लैश में से कोई भी नहीं देख सकते हैं, तो आपको दो वैकल्पिक वर्णों को निर्धारित करने की आवश्यकता है; वे वही होंगे जो [A-Za-z0-9] में नहीं हैं। फिर आपको यह देखने के लिए प्रयोग करना होगा कि उन्हें किस क्रम में 2 के arg में उपयोग करने की आवश्यकता हैbase64.b64decode()

अद्यतन 3 : अपने डेटा "कंपनी गोपनीय" है:
(क) तुम कहते हो तो सामने चाहिए
(ख) हम इस समस्या है, जो अत्यधिक संभावना है क्या अक्षरों के स्थान पर उपयोग किया जाता है से संबंधित होना समझने में अन्य तरीके तलाश कर सकते हैं +और /में एन्कोडिंग वर्णमाला, या अन्य स्वरूपण या बाहरी वर्णों द्वारा।

इस तरह के एक एवेन्यू की जांच होगी कि आपके डेटा में गैर-"मानक" वर्ण क्या हैं, उदाहरण के लिए

from collections import defaultdict
d = defaultdict(int)
import string
s = set(string.ascii_letters + string.digits)
for c in your_data:
   if c not in s:
      d[c] += 1
print d

डेटा मानक base64 वर्ण सेट से सम्‍मिलित है। मुझे पूरा यकीन है कि समस्या इसलिए है क्योंकि 1 या अधिक अक्षर गायब हैं - इसलिए गद्दी त्रुटि। जब तक, पायथन में एक मजबूत समाधान नहीं है, मैं कॉलिंग एसएलएसएल के अपने समाधान के साथ जाऊंगा।
फनलोविनकोडर

1
एक "समाधान" जो चुपचाप त्रुटियों की अनदेखी करता है, वह "मजबूत" शब्द के योग्य है। जैसा कि मैंने पहले उल्लेख किया है, विभिन्न पायथन सुझाव डीबगिंग के तरीके थे जो यह पता लगाने के लिए कि समस्या क्या है, एक PRINCIPLED समाधान की तैयारी ... क्या आप ऐसी चीज में रुचि नहीं रखते हैं?
जॉन मचिन

7
मेरी आवश्यकता इस समस्या को हल करने के लिए नहीं है कि बेस 64 भ्रष्ट क्यों है - यह एक ऐसे स्रोत से आता है जिस पर मेरा कोई नियंत्रण नहीं है। मेरी आवश्यकता भ्रष्ट होने पर भी प्राप्त आंकड़ों के बारे में जानकारी प्रदान करना है। इसका एक तरीका यह है कि बाइनरी डेटा को भ्रष्ट बेस 64 से बाहर निकाला जाए ताकि मैं अंतर्निहित ASN.1 से सूचनाओं को चमका सकूं। स्ट्रीम। मैंने मूल प्रश्न पूछा क्योंकि मैं उस प्रश्न का उत्तर चाहता था कि किसी अन्य प्रश्न का उत्तर न हो - जैसे कि भ्रष्ट आधार को डिबग कैसे किया जाए।
फनलोविनकोडर

बस स्ट्रिंग को सामान्य करें, कुछ भी हटा दें जो कि बेस 64 वर्ण नहीं है। कहीं भी, बस शुरू या अंत नहीं।
मार्टिन पीटर्स

24

उपयोग

string += '=' * (-len(string) % 4)  # restore stripped '='s

क्रेडिट यहाँ एक टिप्पणी के लिए चला जाता है।

>>> import base64

>>> enc = base64.b64encode('1')

>>> enc
>>> 'MQ=='

>>> base64.b64decode(enc)
>>> '1'

>>> enc = enc.rstrip('=')

>>> enc
>>> 'MQ'

>>> base64.b64decode(enc)
...
TypeError: Incorrect padding

>>> base64.b64decode(enc + '=' * (-len(enc) % 4))
>>> '1'

>>> 

4
वह इस टिप्पणी का मतलब है: stackoverflow.com/questions/2941995/…
jackyalcine

22

यदि कोई पेडिंग त्रुटि है, तो इसका मतलब है कि आपका स्ट्रिंग दूषित है; base64- एन्कोडेड स्ट्रिंग्स में चार से अधिक की लंबाई होनी चाहिए। आप =स्ट्रिंग को चार में से एक बनाने के लिए स्वयं को पैडिंग कैरेक्टर ( ) जोड़ने का प्रयास कर सकते हैं , लेकिन यह पहले से ही होना चाहिए जब तक कि कुछ गलत न हो


अंतर्निहित बाइनरी डेटा ASN.1 है। भ्रष्टाचार के साथ भी मैं बाइनरी में वापस जाना चाहता हूं क्योंकि मैं अभी भी ASN.1 स्ट्रीम से कुछ उपयोगी जानकारी प्राप्त कर सकता हूं।
फनलोविनकोडर

सच नहीं है, अगर आप सुरक्षा जांच के लिए एक jwt को डीकोड करना चाहते हैं, तो आपको इसकी आवश्यकता होगी
DAG

4

उस डेटा स्रोत के दस्तावेज़ीकरण की जांच करें जिसे आप डिकोड करने का प्रयास कर रहे हैं। क्या यह संभव है कि आप base64.urlsafe_b64decode(s)इसके बजाय उपयोग करना base64.b64decode(s)चाहते थे ? यही कारण है कि आपने इस त्रुटि संदेश को देखा होगा।

Decode string s एक URL-सुरक्षित वर्णमाला का उपयोग कर रहा है, जो मानक Base64 वर्णमाला में / के बजाय + और _ के स्थान पर प्रतिस्थापित करता है।

यह उदाहरण के लिए विभिन्न Google API के लिए मामला है, जैसे Google की पहचान टूलकिट और जीमेल पेलोड।


1
यह प्रश्न का उत्तर नहीं देता है। साथ ही, urlsafe_b64decodeपेडिंग भी आवश्यक है।
rdb

खैर, इस सवाल का जवाब देने से पहले मेरे पास एक मुद्दा था, जो Google के आइडेंटिटी टूलकिट से संबंधित था। मुझे गलत गद्दी त्रुटि मिल रही थी (मेरा मानना ​​है कि यह सर्वर पर था) कठिन भी गद्दी सही दिखाई दी। पता चला कि मुझे इस्तेमाल करना था base64.urlsafe_b64decode
डैनियल एफ

मैं मानता हूं कि यह सवाल का जवाब नहीं देता है, आरडीबी, फिर भी यह वही था जो मुझे सुनने के लिए आवश्यक था। मैंने जवाब में थोड़ा अच्छे स्वर में कहा, मुझे आशा है कि यह आपके लिए काम करेगा, डैनियल।
हेनरिक हेमबर्गर

पूरी तरह से ठीक। मैंने ध्यान नहीं दिया कि यह कुछ निर्दयी लग रहा था, मैंने केवल यह सोचा था कि यह सबसे तेज फिक्स होगा यदि यह समस्या को ठीक करेगा, और, इस कारण से, कोशिश की जाने वाली पहली चीज होनी चाहिए। आपके बदलाव के लिए धन्यवाद, यह स्वागत योग्य है।
डैनियल एफ

इस उत्तर ने JWT से प्राप्त Google Access टोकन को डिकोड करने की मेरी समस्या को हल कर दिया। अन्य सभी प्रयासों के परिणामस्वरूप "गलत तरीके से पैडिंग" हुई।
जॉन हैनले

2

गद्दी जोड़ना बल्कि ... पूरी तरह से है। इस फ़ंक्शन को मैंने इस थ्रेड में टिप्पणियों के साथ-साथ बेस 64 के लिए विकी पृष्ठ (यह आश्चर्यजनक रूप से उपयोगी है) https://en.wikipedia.org/wiki/Base64#Padding के साथ लिखा था ।

import logging
import base64
def base64_decode(s):
    """Add missing padding to string and return the decoded base64 string."""
    log = logging.getLogger()
    s = str(s).strip()
    try:
        return base64.b64decode(s)
    except TypeError:
        padding = len(s) % 4
        if padding == 1:
            log.error("Invalid base64 string: {}".format(s))
            return ''
        elif padding == 2:
            s += b'=='
        elif padding == 3:
            s += b'='
        return base64.b64decode(s)

2

base64.urlsafe_b64decode(data)यदि आप वेब छवि को डिकोड करने का प्रयास कर रहे हैं, तो आप बस उपयोग कर सकते हैं। यह स्वचालित रूप से गद्दी का ख्याल रखेगा।


यह वास्तव में मदद करता है!
चंद्रमा

1

यहां वर्णित इनपुट डेटा को सही करने के दो तरीके हैं, या, अधिक विशेष रूप से और ओपी के अनुरूप, पायथन मॉड्यूल बेस 64 की b64decode विधि इनपुट डेटा को संसाधित करने में सक्षम है, जो बिना किसी अनचाहे अपवाद को बढ़ाए बिना कुछ करने में सक्षम है:

  1. इनपुट डेटा के अंत में जोड़ें == और कॉल करें base64.b64decode (...)
  2. यदि वह अपवाद को उठाता है, तो

    मैं। इसे आज़माएं / छोड़कर,

    ii। (आर?) इनपुट डेटा से किसी भी = वर्णों को पट्टी करें (एनबी यह आवश्यक नहीं हो सकता है),

    iii। इनपुट डेटा में A == जोड़ें (A == पी == के माध्यम से काम करेगा),

    iv। आधार A == - संलग्न इनपुट डेटा के साथ base64.b64decode (...) पर कॉल करें

आइटम 1 या आइटम 2 से परिणाम। ऊपर वांछित परिणाम प्राप्त होगा।

चेतावनियां

यह डीकोड किए गए परिणाम की गारंटी नहीं देता है कि मूल रूप से एन्कोड किया गया था, लेकिन यह (कभी-कभी?) ओपी को काम करने के लिए पर्याप्त देगा:

भ्रष्टाचार के साथ भी मैं बाइनरी में वापस आना चाहता हूं क्योंकि मैं अभी भी ASN.1 स्ट्रीम से कुछ उपयोगी जानकारी प्राप्त कर सकता हूं ")।

देखें कि हम क्या जानते हैं और नीचे दिए गए अनुमान

टी एल; डॉ

Base64.b64decode (...) के कुछ त्वरित परीक्षणों से

  1. ऐसा प्रतीत होता है कि यह गैर- [A-Za-z0-9 + /] वर्णों को अनदेखा करता है; इसमें अनदेखी करना शामिल है = जब तक कि वे चार के समूह में अंतिम वर्ण (वर्ण) न हों, जिस स्थिति में = s डिकोडिंग समाप्त करता है (a = b = c = d = abc = और a = के समान परिणाम देता है = b == c == ab ==) के समान परिणाम देता है।

  2. यह भी प्रतीत होता है कि संलग्न किए गए सभी वर्णों को उस बिंदु के बाद नजरअंदाज कर दिया जाता है, जहां base64.b64decode (...) एक समूह से चौथे के रूप में = जैसे डिकोडिंग को समाप्त करता है।

जैसा कि ऊपर की कई टिप्पणियों में उल्लेख किया गया है, इनपुट डेटा के अंत में शून्य, या एक, या दो, = की पैडिंग की आवश्यकता होती है, जब [उस बिंदु के लिए पार्स वर्णों की संख्या 4 modulo] मान 0, या 3 है। या 2, क्रमशः। इसलिए, आइटम 3. और 4. ऊपर से, इनपुट डेटा में दो या अधिक = एस को जोड़ने से उन मामलों में कोई भी [गलत तरीके से पैडिंग] समस्याएं ठीक हो जाएंगी।

फिर भी, डिकोडिंग उस मामले को संभाल नहीं सकती है जहाँ [पार्स किए गए वर्णों की कुल संख्या 4] है, क्योंकि यह तीन डीकोड किए गए बाइट्स के समूह में पहली डीकोड की गई बाइट का प्रतिनिधित्व करने के लिए कम से कम दो एन्कोडेड वर्ण लेता है। में संयुक्त राष्ट्र एन्कोडेड इनपुट डेटा भ्रष्ट, इस [एन सापेक्ष 4] = 1 मामला कभी नहीं होता है, लेकिन ओ पी ने कहा कि पात्रों गायब हो सकता है के रूप में, इसे यहाँ भी हो सकता है। इसीलिए, केवल जोड़ना = एस हमेशा काम नहीं करेगा, और == को जोड़ते समय काम करने से == नहीं होगा। NB का उपयोग करना [A] सभी लेकिन मनमाना है: यह केवल हटाए गए (शून्य) बिट्स को डीकोड करने के लिए जोड़ता है, जो सही हो सकता है या नहीं, लेकिन फिर यहाँ ऑब्जेक्ट सही नहीं है लेकिन base64.b64decode (...) द्वारा पूरा किया गया है। ।

हम ओपी और विशेष रूप से बाद की टिप्पणियों से क्या जानते हैं

  • यह संदेह है कि बेस 64-एन्कोडेड इनपुट डेटा में अनुपलब्ध डेटा (अक्षर) हैं
  • Base64 एन्कोडिंग मानक 64 स्थान-मानों के साथ-साथ पैडिंग का उपयोग करता है: AZ; az; 0-9; +; /; = पैडिंग है। यह पुष्टि करता है, या कम से कम सुझाव दिया गया है, इस तथ्य से कि openssl enc ...काम करता है।

मान्यताओं

  • इनपुट डेटा में केवल 7-बिट ASCII डेटा होता है
  • भ्रष्टाचार का एकमात्र प्रकार एन्कोडेड इनपुट डेटा गायब है
  • ओपी किसी भी बिंदु पर डिकोड किए गए आउटपुट डेटा की परवाह नहीं करता है, उसके बाद किसी भी लापता एन्कोडेड इनपुट डेटा के अनुरूप

Github

इस समाधान को लागू करने के लिए एक आवरण है:

https://github.com/drbitboy/missing_b64


1

गलत पेडिंग त्रुटि होती है क्योंकि कभी-कभी, मेटाडेटा एन्कोडेड स्ट्रिंग में भी मौजूद होता है यदि आपका स्ट्रिंग कुछ इस तरह दिखता है: 'डेटा: छवि / पीएनजी; बेस 64, ... बेस 64 सामान ....' तो आपको पहले हटाने की आवश्यकता है इसे डिकोड करने से पहले हिस्सा।

यदि आपके पास छवि बेस 64 एन्कोडेड स्ट्रिंग है, तो नीचे स्निपेट का प्रयास करें।

from PIL import Image
from io import BytesIO
from base64 import b64decode
imagestr = 'data:image/png;base64,...base 64 stuff....'
im = Image.open(BytesIO(b64decode(imagestr.split(',')[1])))
im.save("image.png")

0

बस "=" या किसी अन्य को अतिरिक्त वर्ण जोड़ें और लक्ष्य स्ट्रिंग मान को डिकोड करने का प्रयास करने से पहले इसे 4 का एक बहु बनाएं। कुछ इस तरह;

if len(value) % 4 != 0: #check if multiple of 4
    while len(value) % 4 != 0:
        value = value + "="
    req_str = base64.b64decode(value)
else:
    req_str = base64.b64decode(value)

0

मामले में यह त्रुटि एक वेब सर्वर से आई थी: अपने पोस्ट मान को url एन्कोड करने का प्रयास करें। मैं "कर्ल" के माध्यम से पोस्ट कर रहा था और मुझे पता चला कि मैं अपने बेस 64 मूल्य को url- एन्कोडिंग नहीं कर रहा था, इसलिए "+" जैसे वर्णों को नहीं छोड़ा गया ताकि वेब सर्वर url-decode लॉजिक स्वचालित रूप से url-decode चलाए और + रिक्त स्थान में परिवर्तित हो जाए।

"+" एक वैध आधार 64 चरित्र है और शायद एकमात्र ऐसा चरित्र है जो एक अप्रत्याशित यूआरएल-डिकोड द्वारा मैंगल्ड हो जाता है।


0

मेरे मामले में मुझे ईमेल को पार्स करते समय उस त्रुटि का सामना करना पड़ा। मुझे बेस 64 स्ट्रिंग के रूप में लगाव मिला और इसे पुनः खोज के माध्यम से निकाला। आखिरकार एक अजीब अतिरिक्त विकल्प था।

dHJhaWxlcgo8PCAvU2l6ZSAxNSAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWyhcMDAyXDMz
MHtPcFwyNTZbezU/VzheXDM0MXFcMzExKShcMDAyXDMzMHtPcFwyNTZbezU/VzheXDM0MXFcMzEx
KV0KPj4Kc3RhcnR4cmVmCjY3MDEKJSVFT0YK

--_=ic0008m4wtZ4TqBFd+sXC8--

जब मैंने --_=ic0008m4wtZ4TqBFd+sXC8--स्ट्रिंग को डिलीट और स्ट्रिप किया तब पार्सिंग को ठीक किया गया।

इसलिए मेरी सलाह यह सुनिश्चित करती है कि आप सही base64 स्ट्रिंग को डिकोड कर रहे हैं।


0

आपको उपयोग करना चाहिए

base64.b64decode(b64_string, ' /')

डिफ़ॉल्ट रूप से, वेचर्स हैं '+/'


1
यह अजगर 3.7 में काम नहीं करता है। Assert len ​​(altchars) == 2, repr (altchars)
Dat TT

0

मैं इस समस्या में भी भाग गया और कुछ भी काम नहीं किया। मैं अंत में उस समाधान को खोजने में कामयाब रहा जो मेरे लिए काम करता है। मैंने बेस 64 में सामग्री जिप की थी और यह एक लाख रिकॉर्ड में से 1 हुआ ...

यह साइमन सैपिन द्वारा सुझाए गए समाधान का एक संस्करण है।

यदि पेडिंग 3 गायब है तो मैं अंतिम 3 अक्षर हटाता हूं।

इसके बजाय "0gA1RD5L / 9AUGtH9MzAwAAA =="

हम "0gA1RD5L / 9AUGtH9MzAwAA" प्राप्त करते हैं

        missing_padding = len(data) % 4
        if missing_padding == 3:
            data = data[0:-3]
        elif missing_padding != 0:
            print ("Missing padding : " + str(missing_padding))
            data += '=' * (4 - missing_padding)
        data_decoded = base64.b64decode(data)   

इस जवाब के अनुसार Trailing As as base64 में इसका कारण अशक्त है। लेकिन मुझे अभी तक पता नहीं है कि एनकोडर ने इसे क्यों गड़बड़ किया ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.