کدگذاری و کدگشایی «کمیت با طول متغیر» را پیادهسازی کنید.
هدف این تمرین پیادهسازی کدگذاری/کدگشایی VLQ است.
بهطور خلاصه، هدف این کدگذاری آن است که مقادیر عدد صحیح را طوری کدگذاری کند که در مصرف بایت صرفهجویی شود. تنها ۷ بیت اول هر بایت معنادار است (راستچین؛ تقریباً مثل یک بایت ASCII). بنابراین اگر یک مقدار ۳۲ بیتی داشته باشید، باید آن را به مجموعهای از بایتهای ۷ بیتی تجزیه کنید. البته تعداد بایتها بسته به عدد صحیح شما متغیر خواهد بود. برای نشان دادن اینکه کدام بایت آخرین بایت مجموعه است، بیت شمارهی ۷ را صفر میگذارید. در همهی بایتهای پیشین، بیت شمارهی ۷ را یک میکنید.
پس اگر یک عدد صحیح بین 0-127 باشد، میتوان آن را با یک بایت نمایش داد.
هرچند VLQ میتواند با اعدادی با هر اندازهای کار کند، در این تمرین خودمان را فقط به اعدادی محدود میکنیم که در یک عدد صحیح بدون علامت ۳۲ بیتی جا میشوند.
در ادامه نمونههایی از اعداد صحیح بهصورت مقادیر ۳۲ بیتی و کمیتهای با طول متغیرِ متناظرشان آمده است:
NUMBER VARIABLE QUANTITY
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
گاهی لازم است یک استثنا raise کنید. هنگام انجام این کار، همیشه باید یک پیام خطای معنادار همراه آن بیاورید تا نشان دهید منبع خطا چیست. این کار Code شما را خواناتر میکند و به Debug کمک چشمگیری میکند. در موقعیتهایی که میدانید منبع خطا نوع مشخصی خواهد بود، میتوانید یکی از انواع خطای داخلی را raise کنید، اما همچنان باید پیام معناداری همراه آن بیاورید.
این تمرین خاص از شما میخواهد که از دستور raise استفاده کنید تا در صورتی که دنبالهای که باید رمزگشایی یا رمزگذاری شود ناقص باشد، یک ValueError «پرتاب» کنید. این Testها تنها در صورتی قبول میشوند که هم exception را raise کنید و هم پیامی همراه آن بیاورید.
برای raise کردن یک ValueError همراه با پیام، پیام را بهعنوان آرگومان برای نوع exception بنویسید:
# if the sequence is incomplete
raise ValueError("incomplete sequence")