وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

رمزگذاری طول اجرا

0 8

سرفصلهای مطلب

زمان لازم برای مطالعه: 3 دقیقه


در این مقاله به روش عملکرد الگوریتم رمزگذاری طول اجرا، کاربرد آن و روش پیاده سازی توابع رمزگشایی و رمزگشایی آن در پایتون خواهیم پرداخت.

رمزگذاری طول اجرا (RLE) یک شکل بسیار ساده از فشرده سازی داده است که در آن جریانی از داده به عنوان ورودی داده می شود (یعنی “AAABBCCCC”) و خروجی دنباله ای از تعداد مقادیر متوالی داده در یک ردیف است (یعنی ” 3A2B4C”). این نوع فشرده‌سازی داده‌ها بدون تلفات است، به این معنی که هنگام فشرده‌سازی، تمام داده‌های اصلی هنگام رمزگشایی بازیابی می‌شوند. سادگی آن در هر دو رمزگذاری (فشرده سازی) و رمزگشایی (فشرده سازی) یکی از جذاب ترین ویژگی های الگوریتم است.

در اینجا می توانید یک مثال ساده از یک جریان (“اجرای”) از داده ها را به شکل اصلی و رمزگذاری شده آن مشاهده کنید:

داده های ورودی:

AAAAAAFDDCCCCCCCAEEEEEEEEEEEEEEEEE

داده های خروجی:

6A1F2D7C1A17E

در این مثال ما توانستیم داده ها را از 34 کاراکتر به 13 فشرده کنیم.

همانطور که ممکن است متوجه شده باشید، هر چه مقادیر متوالی در یک ردیف بیشتر باشد، فضای بیشتری در فشرده سازی حاصل صرفه جویی می کنیم. از سوی دیگر، اگر دنباله ای از داده ها دارید که به طور مکرر بین مقادیر تغییر می کند (به عنوان مثال “BEFEFADED”) در این صورت اصلاً فضای زیادی ذخیره نمی کنیم. در واقع، ما حتی می‌توانیم اندازه داده‌های خود را افزایش دهیم زیرا یک نمونه از یک کاراکتر منجر به 2 کاراکتر (یعنی “A” تبدیل به “1A”) در خروجی رمزگذاری می‌شود.

به همین دلیل، RLE فقط برای انواع خاصی از داده ها و برنامه ها مناسب است. به عنوان مثال دوربین پیکسی، که یک دوربین روباتیک است که به شما کمک می کند اشیا را به راحتی ردیابی کنید، از RLE برای فشرده سازی داده های ویدیویی برچسب زده شده قبل از انتقال آن از دستگاه دوربین تعبیه شده به یک برنامه خارجی استفاده می کند. به هر پیکسل یک برچسب “بدون شی”، “شی 1″، “شی 2″، و غیره داده می شود. این رمزگذاری عالی برای این برنامه به دلیل سادگی، سرعت، و توانایی آن در فشرده سازی داده های برچسب آنتروپی پایین است.

رمزگذاری

برای رمزگذاری رشته ای از داده ها، کد شما باید از طریق هر یک از کاراکترهای داده ها حلقه بزند و رخدادها را شمارش کند. هنگامی که یک کاراکتر متفاوت از کاراکتر قبلی را مشاهده کردید، تعداد تکرارها را اضافه خواهید کرد و کاراکتر رمزگذاری شما

در زیر یک پیاده سازی ساده در پایتون پیدا خواهید کرد:



def rle_encode(data):
    encoding = ''
    prev_char = ''
    count = 1

    if not data: return ''

    for char in data:
        
        
        if char != prev_char:
            
            
            if prev_char:
                encoding += str(count) + prev_char
            count = 1
            prev_char = char
        else:
            
            
            count += 1
    else:
        
        encoding += str(count) + prev_char
        return encoding

از نظرات شما باید بتوانید تشخیص دهید که چه اتفاقی می افتد روی در سراسر کد اگر نه، تمرین خوبی خواهد بود که کد را با یک دیباگر اجرا کنید و آن را در عمل ببینید.

در ادامه با همان فایل بالا، در اینجا نمونه ای از کد اجرا شده است:

encoded_val = rle_encode('AAAAAAFDDCCCCCCCAEEEEEEEEEEEEEEEEE')
print(encoded_val)

و خروجی:

$ python rle-encode.py
6A1F2D7C1A17E

رمزگشایی

رمزگشایی یک جریان داده با رمزگذاری RLE در واقع حتی ساده تر از رمزگذاری آن است. مانند قبل، شما از طریق جریان داده یک کاراکتر را در یک زمان تکرار می کنید. اگر یک کاراکتر عددی می بینید، آن را به کاراکتر خود اضافه می کنید count، و اگر یک کاراکتر غیر عددی می بینید، اضافه می کنید count از آن نویسه‌های رمزگشایی شما، که پس از تکرار در تمام ورودی‌ها به تماس‌گیرنده بازگردانده می‌شود.data.

در اینجا الگوریتم پیاده سازی شده در پایتون آمده است:



def rle_decode(data):
    decode = ''
    count = ''
    for char in data:
        
        if char.isdigit():
            
            count += char
        else:
            
            
            
            decode += char * int(count)
            count = ''
    return decode

ما می توانیم این کد را اجرا کنیم روی همان خروجی ای که از رمزگذاری خود گرفتیم:

decoded_val = rle_decode('6A1F2D7C1A17E')
print(decoded_val)

و خروجی همان ورودی اصلی ما به تابع رمزگذاری است:

$ python rle-decode.py
AAAAAAFDDCCCCCCCAEEEEEEEEEEEEEEEEE

توجه داشته باشید که این پیاده‌سازی برای اطمینان از اینکه جریان داده‌های RLE معتبری داریم، هیچ بررسی خطایی انجام نمی‌دهد. اگر هر یک از داده های ورودی به درستی فرمت نشده باشد، احتمالاً با خطا مواجه خواهید شد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-22 03:23:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید