کتابخانه‌ی استاندارد · کدگذاری و داده

پروتوباف encoding/protobuf

خواندن پرونده‌های .proto، کدگذاری سیمی Protocol Buffers و ساختن کد سلام از آن‌ها.

واردسازی کدگذاری.پروتوباف

Protocol Buffers قالب دودویی گوگل برای پیام‌های ساختارمند است. شکل پیام‌ها در پرونده‌ی .proto تعریف می‌شود و این بسته آن را می‌خواند، کد سلام برای پیام‌ها و سرویس‌ها می‌سازد و ابزار سطح پایین نوشتن و خواندن فیلدها را هم دارد.

هر فیلد در بایت‌ها با یک برچسب (شماره‌ی فیلد و نوع سیم) و سپس مقدارش می‌آید. عددها معمولاً varint نوشته می‌شوند: هر بایت ۷ بیت از عدد را دارد و بیت بالایش می‌گوید بایت دیگری هم هست.

وقتی با سرویسی حرف می‌زنید که از پیش همین قالب را به کار می‌برد، معمولاً از راه جی آر پی سی، یا وقتی چند زبان یک طرح‌واره‌ی مشترک دارند، Protocol Buffers را به کار ببرید. میان برنامه‌های سلام، یا وقتی پرونده‌ی .protoای در کار نیست، مسج‌پک طرح‌واره لازم ندارد و جیسون خوانا می‌ماند.

اشتباه‌های رایج

  • خواننده‌های ساخته‌شده عددهای تکراری فشرده را نمی‌پذیرند. نویسنده‌های proto3 مثل protoc، Go و Java یک repeated int32 را به‌طور پیش‌فرض به شکل یک بلوک طول‌دار می‌فرستند. Unmarshal ساخته‌شده برای هر عضو یک برچسب انتظار دارد و نوع سیم را بررسی نمی‌کند، پس فیلد فشرده یا شکست می‌خورد یا عددهای نادرست می‌دهد. Marshal ساخته‌شده شکل فشرده‌نشده را می‌نویسد که همه‌ی خواننده‌ها می‌پذیرند. فیلدهای فشرده را مثل راهنمای عددهای فشرده با دست بخوانید، یا در طرف دیگر فیلد را [packed = false] کنید.
  • تولیدکننده فیلدهای پیام، شمارشی و map را کنار می‌گذارد. عضوهای یک oneof فیلدهای معمولی می‌شوند، پس چیزی جلوی مقدار گرفتن دو عضو با هم را نمی‌گیرد. این بخش‌ها را با دست بنویسید.
  • varintها u64 هستند. خواندن عدد متغیر یک طبیعی۶۴ برمی‌گرداند؛ خودتان آن را به صحیح۶۴ یا صحیح تبدیل کنید و فیلدهای sint را از کدگشایی زیگزاگ۶۴ بگذرانید.
  • ok را یک بار، در پایان، بررسی کنید. هر خواننده وقتی داده تمام شود پرچم مشترک ok را نادرست می‌کند؛ هیچ چیز برنامه را متوقف نمی‌کند، پس پیش از به کار بردن نتیجه آن را بیازمایید.

راهنمای زیر کارهایی را که در عمل پیش می‌آید یکی‌یکی جلو می‌برد: نوشتن یک پیام با دست، خواندن دوباره‌ی آن و رد شدن از فیلدهای ناشناخته، پیام‌های تودرتو، عددهای تکراری فشرده، انتخاب میان int64 و sint64، و ساختن کد از پرونده‌ی .proto به جای نوشتن آن. همه‌ی بافرهای بایت این‌جا بافر بایت از بسته‌ی فشرده سازی هستند، پس برنامه‌ها هر دو بسته را وارد می‌کنند.

نوشتن یک پیام با دست

یک پیام چیزی جز فیلدهایش پشت سر هم نیست. برای هر فیلد نوشتن برچسب را با شماره‌ی فیلد در پرونده‌ی .proto و نوع سیم صدا بزنید و بعد نویسنده‌ی مقدار را: نوشتن عدد متغیر برای عدد صحیح، شمارشی و منطقی، نوشتن رشته طول‌دار برای رشته و نوشتن بایت‌های طول‌دار برای بایت‌ها و پیام‌های تودرتو. برنامه‌ی زیر پیام User { id: 42, name: "سارا", admin: true } را می‌نویسد و بایت‌هایش را به شکل شانزده‌شانزدهی چاپ می‌کند.

encoding-protobuf-encode-user.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

تابع شانزده‌شانزدهی(ب: فشرده سازی.بافر بایت): رشته:
    رقم‌ها := "0123456789abcdef"
    ناپایا خروجی := ""
    تکرار فشرده سازی.طول بافر(ب) در ی:
        مقدار بایت := فشرده سازی.دریافت بایت(ب، ی)
        اگر ی بزرگتر ۰: خروجی = خروجی + " " پایان
        خروجی = خروجی + رقم‌ها.زیررشته(مقدار بایت / ۱۶، ۱) + رقم‌ها.زیررشته(مقدار بایت % ۱۶، ۱)
    پایان
    برگشت خروجی
پایان

تابع ریشه:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(ب، ۱، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(ب، ۴۲ برگردان طبیعی۶۴)
    پروتوباف.نوشتن برچسب(ب، ۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(ب، "سارا")
    پروتوباف.نوشتن برچسب(ب، ۳، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(ب، ۱ برگردان طبیعی۶۴)
    سرچاپ "تعداد بایت:"، فشرده سازی.طول بافر(ب)
    سرچاپ شانزده‌شانزدهی(ب)
    فشرده سازی.آزادسازی بافر(ب)
پایان
خروجیتعداد بایت: 14 08 2a 12 08 d8 b3 d8 a7 d8 b1 d8 a7 18 01

خروجی را جفت‌جفت بخوانید: 08 یعنی فیلد ۱ با نوع سیم ۰ و 2a همان ۴۲ است؛ 12 فیلد ۲ با نوع سیم ۲ است، 08 طول و پس از آن هشت بایت UTF-8 واژه‌ی «سارا» (هر حرف فارسی دو بایت می‌گیرد)؛ 18 01 هم فیلد ۳ با مقدار درست است. proto3 فیلدی را که مقدار پیش‌فرض دارد (صفر، رشته‌ی خالی، نادرست) نمی‌نویسد، پس فرستنده معمولا پیش از نوشتن برچسب مقدار را بررسی می‌کند.

خواندن پیام و رد شدن از فیلدهای ناشناخته

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

encoding-protobuf-decode-loop.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

ساختار کاربر:
    همگانی شناسه: صحیح = ۰
    همگانی نام: رشته = ""
    همگانی مدیر: منطقی = نادرست
پایان

تابع خواندن کاربر(داده: تهی*، اندازه: صحیح، سالم &: منطقی): کاربر:
    ناپایا ک := کاربر {}
    ناپایا خ := فشرده سازی.خواننده بایت جدید(داده، اندازه)
    سالم = درست
    تا فشرده سازی.باقیمانده(خ) بزرگتر ۰ و سالم:
        ناپایا شماره := ۰
        ناپایا سیم := ۰
        پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
        اگر وارونه سالم: برگشت ک پایان
        ترابرد شماره:
            ۱:
                ک.شناسه = پروتوباف.خواندن عدد متغیر(خ، سالم) برگردان صحیح
                بشکن
            پایان
            ۲:
                ک.نام = پروتوباف.خواندن رشته طول‌دار(خ، سالم)
                بشکن
            پایان
            ۳:
                ک.مدیر = پروتوباف.خواندن عدد متغیر(خ، سالم) نابرابر (۰ برگردان طبیعی۶۴)
                بشکن
            پایان
            وگرنه:
                سرچاپ "رد شدن از فیلد ناشناخته‌ی"، شماره
                پروتوباف.رد کردن فیلد(خ، سیم، سالم)
            پایان
        پایان
    پایان
    برگشت ک
پایان

تابع ریشه:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(ب، ۱، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(ب، ۴۲ برگردان طبیعی۶۴)
    پروتوباف.نوشتن برچسب(ب، ۹، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(ب، "افزوده در نسخه ۲")
    پروتوباف.نوشتن برچسب(ب، ۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(ب، "سارا")
    ناپایا سالم := نادرست
    ک := خواندن کاربر(ب.داده، فشرده سازی.طول بافر(ب)، سالم)
    سرچاپ سالم، ک.شناسه، ک.نام، ک.مدیر
    _ := خواندن کاربر(ب.داده، فشرده سازی.طول بافر(ب) - ۲، سالم)
    سرچاپ "پیام بریده:"، سالم
    فشرده سازی.آزادسازی بافر(ب)
پایان
خروجیرد شدن از فیلد ناشناخته‌ی 9 true 42 سارا false رد شدن از فیلد ناشناخته‌ی 9 پیام بریده: false

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

پیام‌های تودرتو و تکراری

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

encoding-protobuf-nested.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

تابع نوشتن قلم(سفارش &: فشرده سازی.بافر بایت، نام: رشته، تعداد: صحیح):
    ناپایا قلم := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(قلم، ۱، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(قلم، نام)
    پروتوباف.نوشتن برچسب(قلم، ۲، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(قلم، تعداد برگردان طبیعی۶۴)
    پروتوباف.نوشتن برچسب(سفارش، ۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن بایت‌های طول‌دار(سفارش، قلم.داده، فشرده سازی.طول بافر(قلم))
    فشرده سازی.آزادسازی بافر(قلم)
پایان

تابع نمایش قلم(ب: فشرده سازی.بافر بایت):
    ناپایا خ := فشرده سازی.خواننده از بافر(ب)
    ناپایا سالم := درست
    ناپایا نام := ""
    ناپایا تعداد := ۰
    تا فشرده سازی.باقیمانده(خ) بزرگتر ۰ و سالم:
        ناپایا شماره := ۰
        ناپایا سیم := ۰
        پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
        اگر شماره برابر ۱: نام = پروتوباف.خواندن رشته طول‌دار(خ، سالم)
        وگرنه شماره برابر ۲: تعداد = پروتوباف.خواندن عدد متغیر(خ، سالم) برگردان صحیح
        وگرنه: پروتوباف.رد کردن فیلد(خ، سیم، سالم) پایان
    پایان
    سرچاپ "  قلم"، نام، "تعداد"، تعداد
پایان

تابع ریشه:
    ناپایا سفارش := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(سفارش، ۱، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(سفارش، ۱۰۰۱ برگردان طبیعی۶۴)
    نوشتن قلم(سفارش، "خودکار"، ۳)
    نوشتن قلم(سفارش، "دفتر"، ۱)
    سرچاپ "بایت‌های سفارش:"، فشرده سازی.طول بافر(سفارش)

    ناپایا خ := فشرده سازی.خواننده از بافر(سفارش)
    ناپایا سالم := درست
    تا فشرده سازی.باقیمانده(خ) بزرگتر ۰ و سالم:
        ناپایا شماره := ۰
        ناپایا سیم := ۰
        پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
        اگر شماره برابر ۱:
            سرچاپ "سفارش"، پروتوباف.خواندن عدد متغیر(خ، سالم)
        وگرنه شماره برابر ۲:
            ناپایا زیرپیام := پروتوباف.خواندن بافر طول‌دار(خ، سالم)
            نمایش قلم(زیرپیام)
            فشرده سازی.آزادسازی بافر(زیرپیام)
        وگرنه:
            پروتوباف.رد کردن فیلد(خ، سیم، سالم)
        پایان
    پایان
    فشرده سازی.آزادسازی بافر(سفارش)
پایان
خروجیبایت‌های سفارش: 35 سفارش 1001 قلم خودکار تعداد 3 قلم دفتر تعداد 1

عددهای تکراری فشرده

یک فیلد repeated از عددها به دو شکل جابه‌جا می‌شود. در شکل فشرده‌نشده هر عضو برچسب خودش را دارد. در شکل فشرده، که در proto3 پیش‌فرض است، یک برچسب با نوع سیم WT_LEN می‌آید و varintها پشت سر هم درون آن قرار می‌گیرند. خواننده‌ی درست هر دو را می‌پذیرد، پس به نوع سیم نگاه کنید: برای WT_LEN بلوک را با خواندن بافر طول‌دار بگیرید و تا خالی شدنش varint بخوانید.

encoding-protobuf-packed.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

تابع خواندن امتیازها(ب: فشرده سازی.بافر بایت): وکتور<صحیح>:
    ناپایا خروجی := وکتور {} برگردان وکتور<صحیح>
    ناپایا خ := فشرده سازی.خواننده از بافر(ب)
    ناپایا سالم := درست
    تا فشرده سازی.باقیمانده(خ) بزرگتر ۰ و سالم:
        ناپایا شماره := ۰
        ناپایا سیم := ۰
        پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
        اگر شماره برابر ۱ و سیم برابر پروتوباف.نوع سیم طول‌دار:
            ناپایا فشرده := پروتوباف.خواندن بافر طول‌دار(خ، سالم)
            ناپایا خف := فشرده سازی.خواننده از بافر(فشرده)
            تا فشرده سازی.باقیمانده(خف) بزرگتر ۰ و سالم:
                خروجی.بیفزا(پروتوباف.خواندن عدد متغیر(خف، سالم) برگردان صحیح)
            پایان
            فشرده سازی.آزادسازی بافر(فشرده)
        وگرنه شماره برابر ۱ و سیم برابر پروتوباف.نوع سیم متغیر:
            خروجی.بیفزا(پروتوباف.خواندن عدد متغیر(خ، سالم) برگردان صحیح)
        وگرنه:
            پروتوباف.رد کردن فیلد(خ، سیم، سالم)
        پایان
    پایان
    برگشت خروجی
پایان

تابع ریشه:
    امتیازها := [۷، ۱۵۰، ۳]

    ناپایا بدنه := فشرده سازی.بافر بایت جدید()
    هر ا در امتیازها:
        پروتوباف.نوشتن عدد متغیر(بدنه، ا برگردان طبیعی۶۴)
    پایان
    ناپایا فشرده := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(فشرده، ۱، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن بایت‌های طول‌دار(فشرده، بدنه.داده، فشرده سازی.طول بافر(بدنه))

    ناپایا جدا := فشرده سازی.بافر بایت جدید()
    هر ا در امتیازها:
        پروتوباف.نوشتن برچسب(جدا، ۱، پروتوباف.نوع سیم متغیر)
        پروتوباف.نوشتن عدد متغیر(جدا، ا برگردان طبیعی۶۴)
    پایان

    سرچاپ "فشرده:"، فشرده سازی.طول بافر(فشرده)، "بایت ->"، خواندن امتیازها(فشرده)
    سرچاپ "جدا:  "، فشرده سازی.طول بافر(جدا)، "بایت ->"، خواندن امتیازها(جدا)
    فشرده سازی.آزادسازی بافر(جدا)
    فشرده سازی.آزادسازی بافر(فشرده)
    فشرده سازی.آزادسازی بافر(بدنه)
پایان
خروجیفشرده: 6 بایت -> [7, 150, 3] جدا: 7 بایت -> [7, 150, 3]

فشرده‌سازی برای هر عضو یک بایت برچسب صرفه‌جویی می‌کند که در فهرست‌های بلندِ عددهای کوچک به چشم می‌آید. برای فیلدی که از کد ساخته‌شده با protoc در زبانی دیگر می‌آید هم باید همین کد را به جای Unmarshal ساخته‌شده به کار ببرید.

عدد منفی: int64 یا sint64

فیلد ساده‌ی int32 یا int64 عدد منفی را به شکل یک عدد بی‌علامت بسیار بزرگ می‌نویسد که همیشه ده بایت می‌شود. گونه‌های sint32 و sint64 اول عدد را با زیگزاگ جابه‌جا می‌کنند (۰، ‎-۱، ۱، ‎-۲ می‌شوند ۰، ۱، ۲، ۳) تا عددهای منفی کوچک، کوچک بمانند. پیش از نوشتن عدد متغیر از کدگذاری زیگزاگ۶۴ و پس از خواندن عدد متغیر از کدگشایی زیگزاگ۶۴ استفاده کنید، و برای فیلدهایی مثل جابه‌جایی یا تغییر دما که اغلب زیر صفرند در پرونده‌ی .proto گونه‌ی sint64 را بگذارید.

encoding-protobuf-zigzag.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

تابع اندازه عدد متغیر(عدد: طبیعی۶۴): صحیح:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن عدد متغیر(ب، عدد)
    اندازه := فشرده سازی.طول بافر(ب)
    فشرده سازی.آزادسازی بافر(ب)
    برگشت اندازه
پایان

تابع ریشه:
    مقدارها := [۵، -۱، -۶۴، ۳۰۰، -۳۰۰]
    هر م در مقدارها:
        پهن := م برگردان صحیح۶۴
        ساده := اندازه عدد متغیر(پهن برگردان طبیعی۶۴)
        زیگزاگ := اندازه عدد متغیر(پروتوباف.کدگذاری زیگزاگ۶۴(پهن))
        سرچاپ م، "به شکل int64"، ساده، "بایت و به شکل sint64"، زیگزاگ، "بایت می‌گیرد"
    پایان
    سرچاپ "زیگزاگ -۱ برابر"، پروتوباف.کدگذاری زیگزاگ۶۴(-۱ برگردان صحیح۶۴)، "و برگشت آن"، پروتوباف.کدگشایی زیگزاگ۶۴(۱ برگردان طبیعی۶۴)
پایان
خروجی5 به شکل int64 1 بایت و به شکل sint64 1 بایت می‌گیرد -1 به شکل int64 10 بایت و به شکل sint64 1 بایت می‌گیرد -64 به شکل int64 10 بایت و به شکل sint64 1 بایت می‌گیرد 300 به شکل int64 2 بایت و به شکل sint64 2 بایت می‌گیرد -300 به شکل int64 10 بایت و به شکل sint64 2 بایت می‌گیرد زیگزاگ -۱ برابر 1 و برگشت آن -1

ساختن کد از پرونده‌ی .proto

وقتی پیام‌ها بیش از دو سه تا شدند، نوشتن کد را به بسته بسپارید. تولید کد متن .proto را به یک بسته‌ی سلام تبدیل می‌کند که برای هر پیام یک ساختار و یک تابع Marshal و Unmarshal دارد؛ تولید با سرویس‌ها برای سرویس‌ها هم کد کارخواه gRPC می‌سازد (بسته‌ی grpc را ببینید). برنامه‌ی زیر فقط سطرهای تعریف کد ساخته‌شده را چاپ می‌کند.

encoding-protobuf-codegen.salam
واردسازی کدگذاری.پروتوباف

تابع ریشه:
    پروتو := "syntax = \"proto3\";\nmessage Point {\n  sint32 x = 1;\n  sint32 y = 2;\n  string label = 3;\n}\n"
    ناپایا سالم := نادرست
    کد := پروتوباف.تولید کد(پروتو، سالم)
    اگر وارونه سالم:
        سرچاپ "پرونده‌ی proto تجزیه نشد"
        برگشت ۱
    پایان
    خط‌ها := کد.بشکاف("\n")
    هر خط در خط‌ها:
        اگر خط.شروع با("pub ") یا خط.شروع با("package "):
            سرچاپ خط
        پایان
    پایان
    برگشت ۰
پایان
خروجیpackage generated_pb pub struct Point: pub func MarshalPoint(m: Point): compress.ByteBuf: pub func UnmarshalPoint(data: void*, n: int, ok &: bool): Point:

متن خروجی را در پرونده‌ای مثل point_pb.salam ذخیره کنید، فراخوانی pb "point_pb.salam" را به برنامه بیفزایید و با pb.MarshalPoint(p) یک بافر بایت بگیرید و با pb.UnmarshalPoint(buf.data, buf.len, ok) آن را دوباره بخوانید. کد ساخته‌شده انگلیسی است، چون نام‌ها از پرونده‌ی .proto می‌آیند. تولیدکننده فیلدهای ساده، رشته، بایت و فیلدهای تکراری ساده را پوشش می‌دهد. فیلدهایی را که نوعشان پیام دیگر یا شمارشی است کنار می‌گذارد، برای فیلدهای map کدی نمی‌سازد و عضوهای oneof را فیلد معمولی می‌کند؛ آن چند فیلد را مثل نمونه‌ی تودرتوی بالا با دست بنویسید یا شمارشی را در پرونده‌ی .proto به شکل int32 نگه دارید. عددهای تکراری فقط به شکل فشرده‌نشده خوانده می‌شوند؛ راهنمای عددهای فشرده را ببینید.

کدام تابع برای کدام گونه‌ی فیلد

گونه در .protoنوع سیمنوشتنخواندن
int32 int64 uint32 uint64 bool enumنوع سیم متغیرنوشتن عدد متغیرخواندن عدد متغیر
sint32 sint64نوع سیم متغیرکدگذاری زیگزاگ۶۴ و سپس نوشتن عدد متغیرخواندن عدد متغیر و سپس کدگشایی زیگزاگ۶۴
fixed32 sfixed32نوع سیم ثابت۳۲نوشتن ثابت۳۲خواندن ثابت۳۲
fixed64 sfixed64نوع سیم ثابت۶۴نوشتن ثابت۶۴خواندن ثابت۶۴
floatنوع سیم ثابت۳۲نوشتن اعشار۳۲خواندن اعشار۳۲
doubleنوع سیم ثابت۶۴نوشتن اعشار۶۴خواندن اعشار۶۴
stringنوع سیم طول‌دارنوشتن رشته طول‌دارخواندن رشته طول‌دار
bytes و پیام تودرتونوع سیم طول‌دارنوشتن بایت‌های طول‌دارخواندن بافر طول‌دار

گونه‌ها

فیلد پروتو PField

ساختار فیلد پروتو
یک فیلد پیام.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
نوعkindصحیح = 0نوع فیلد؛ یکی از ثابت‌های نوع فیلد.
نام نوعtypeNameرشته = ""نام گونه برای پیام و شمارشی. تجزیه‌گر نام‌ها را حل نمی‌کند، پس شمارشی هم نوع پیام می‌گیرد.
نوع کلیدkeyKindصحیح = 0نوع کلید برای map.
نوع مقدار نقشهmapValueKindصحیح = 0نوع مقدار برای map.
نام نوع مقدار نقشهmapValueTypeNameرشته = ""نام گونه‌ی مقدار map.
شمارهnumberصحیح = 0شماره‌ی فیلد.
تکرارشوندهrepeatedمنطقی = نادرستفیلد تکرارشونده است.
فشردهpackedOptمنطقی = درستعددهای تکراری فشرده نوشته شوند.
شماره گروه یکی ازoneofIndexصحیح = -1شماره‌ی گروه oneof؛ ‎-1 اگر نباشد.
منسوخis_deprecatedمنطقی = نادرستفیلد منسوخ علامت خورده.
encoding-protobuf-Parse.salam
واردسازی کدگذاری.پروتوباف

تابع ریشه:
    منبع := "syntax = \"proto3\";\npackage shop;\n\nenum Status { OPEN = 0; DONE = 1; }\n\nmessage Order {\n  int64 id = 1;\n  repeated string items = 2;\n  map<string, int32> counts = 3;\n  Status status = 4;\n  oneof pay { string card = 5; bool cash = 6; }\n}\n\nservice Orders {\n  rpc Get (Order) returns (Order);\n  rpc Watch (Order) returns (stream Order);\n}\n"
    ناپایا خوب := نادرست
    پ := پروتوباف.تجزیه پرونده(منبع، خوب)
    سرچاپ خوب، پ.نام پکیج، پ.پیام‌ها.طول()، پ.شمارشی‌ها.طول()، پ.سرویس‌ها.طول()، پ.پرونده‌های واردشده.طول()
    پیام := پ.پیام‌ها[۰]
    سرچاپ پیام.نام، پیام.فیلدها.طول()، پیام.گروه‌های یکی از[۰].نام، پیام.گروه‌های یکی از[۰].شماره فیلدها
    هر ف در پیام.فیلدها:
        سرچاپ ف.شماره، ف.نام، پروتوباف.نام نوع فیلد(ف.نوع)، ف.نام نوع، ف.تکرارشونده، ف.شماره گروه یکی از
    پایان
    م := پیام.فیلدها[۲]
    سرچاپ م.نوع == پروتوباف.نوع فیلد نگاشت، پروتوباف.نام نوع فیلد(م.نوع کلید)، پروتوباف.نام نوع فیلد(م.نوع مقدار نقشه)
    ش := پ.شمارشی‌ها[۰]
    سرچاپ ش.نام، ش.مقدارها[۱].نام، ش.مقدارها[۱].عدد
    س := پ.سرویس‌ها[۰]
    سرچاپ س.نام، س.متدها[۱].نام، س.متدها[۱].نوع درخواست، س.متدها[۱].خروجی جریانی، س.متدها[۱].ورودی جریانی
    سرچاپ پروتوباف.نوع ساده از نام("sint64") == پروتوباف.نوع فیلد صحیح۶۴ زیگزاگ، پروتوباف.نوع ساده از نام("Order")
    ناپایا ن := پروتوباف.نشانه گذاری("message A { int32 x = 1; }"، خوب)
    سرچاپ خوب، ن.نشانه‌ها.طول()، ن.نشانه‌ها[۰].متن، ن.نشانه‌ها[۰].نوع == پروتوباف.نشانه شناسه، ن.نشانه‌ها[۲].نوع == پروتوباف.نشانه آکولاد باز
    سرچاپ ن.نشانه‌ها[۶].مقدار صحیح، ن.نشانه‌ها[۶].شماره خط
    _ := پروتوباف.تجزیه پرونده("message {"، خوب)
    سرچاپ خوب
پایان
خروجیtrue shop 1 1 1 0 Order 6 pay [4, 5] 1 id int64 false -1 2 items string true -1 3 counts map false -1 4 status message Status false -1 5 card string false 0 6 cash bool false 0 true string int32 Status DONE 1 Orders Watch Order true false true 0 true 10 message true true 1 1 false

گروه یکی از POneof

ساختار گروه یکی از
یک گروه oneof: از میان فیلدهایش فقط یکی مقدار دارد.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
شماره فیلدهاfieldIndicesوکتور<صحیح>شماره‌ی فیلدهای عضو در پیام.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

مقدار شمارشی پروتو PEnumValue

ساختار مقدار شمارشی پروتو
یک مقدار شمارشی.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
عددnumberصحیح = 0عدد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

شمارشی پروتو PEnum

ساختار شمارشی پروتو
یک شمارشی.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
مقدارهاvaluesوکتور<مقدار شمارشی پروتو>مقدارها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پیام پروتو PMessage

ساختار پیام پروتو
یک پیام.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
فیلدهاfieldsوکتور<فیلد پروتو>فیلدها به ترتیب تعریف.
گروه‌های یکی ازoneofsوکتور<گروه یکی از>گروه‌های oneof.
پیام‌های درونیnestedMessagesوکتور<پیام پروتو>پیام‌های درونی.
شمارشی‌های درونیnestedEnumsوکتور<شمارشی پروتو>شمارشی‌های درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

متد پروتو PMethod

ساختار متد پروتو
یک متد سرویس.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
نوع درخواستinputTypeرشته = ""گونه‌ی ورودی.
نوع پاسخoutputTypeرشته = ""گونه‌ی خروجی.
ورودی جریانیclientStreamمنطقی = نادرستورودی جریانی است.
خروجی جریانیserverStreamمنطقی = نادرستخروجی جریانی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

سرویس پروتو PService

ساختار سرویس پروتو
یک سرویس gRPC.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
متدهاmethodsوکتور<متد پروتو>متدها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پرونده پروتو PFile

ساختار پرونده پروتو
یک پرونده‌ی .proto خوانده‌شده.
نامانگلیسیگونهتوضیح
نام پکیجpackageNameرشته = ""نام بسته.
پیام‌هاmessagesوکتور<پیام پروتو>پیام‌ها.
شمارشی‌هاenumsوکتور<شمارشی پروتو>شمارشی‌های سطح بالا.
پرونده‌های واردشدهimportsوکتور<رشته>پرونده‌های واردشده.
سرویس‌هاservicesوکتور<سرویس پروتو>سرویس‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

جریان نشانه پروتو PTokenStream

ساختار جریان نشانه پروتو
نشانه‌های یک متن.
نامانگلیسیگونهتوضیح
نشانه‌هاtoksوکتور<نشانه پروتو>نشانه‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نشانه پروتو PToken

ساختار نشانه پروتو
یک نشانه.
نامانگلیسیگونهتوضیح
نوعkindصحیحنوع نشانه.
متنlexemeرشته = ""متن نشانه.
مقدار صحیحivalصحیح۶۴ = 0مقدار عدد صحیح.
مقدار اعشاریfvalاعشار۶۴ = 0مقدار عدد اعشاری.
مقدار رشتهsvalرشته = ""مقدار رشته.
شماره خطlineصحیح = 0شماره‌ی خط.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پایاها و متغیرها

نوع فیلدها FK_…

مقدار kind هر فیلد: گونه‌های ساده‌ی پروتوباف، پیام، شمارشی و نگاشت.
نامانگلیسیمقدار
نوع فیلد اعشار۶۴FK_DOUBLE1
نوع فیلد اعشار۳۲FK_FLOAT2
نوع فیلد صحیح۳۲FK_INT323
نوع فیلد صحیح۶۴FK_INT644
نوع فیلد طبیعی۳۲FK_UINT325
نوع فیلد طبیعی۶۴FK_UINT646
نوع فیلد صحیح۳۲ زیگزاگFK_SINT327
نوع فیلد صحیح۶۴ زیگزاگFK_SINT648
نوع فیلد ثابت۳۲FK_FIXED329
نوع فیلد ثابت۶۴FK_FIXED6410
نوع فیلد ثابت علامت‌دار۳۲FK_SFIXED3211
نوع فیلد ثابت علامت‌دار۶۴FK_SFIXED6412
نوع فیلد منطقیFK_BOOL13
نوع فیلد رشتهFK_STRING14
نوع فیلد بایت‌هاFK_BYTES15
نوع فیلد پیامFK_MESSAGE16
نوع فیلد شمارشیFK_ENUM17
نوع فیلد نگاشتFK_MAP18

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نوع سیم WT_…

شیوه‌ی نوشتن مقدار فیلد در بایت‌ها: عدد متغیر، ۸ بایت ثابت، طول‌دار یا ۴ بایت ثابت.
نامانگلیسیمقدار
نوع سیم متغیرWT_VARINT0
نوع سیم ثابت۶۴WT_FIXED641
نوع سیم طول‌دارWT_LEN2
نوع سیم ثابت۳۲WT_FIXED325
encoding-protobuf-Wire.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

تابع ریشه:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(ب، ۱، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(ب، ۱۵۰ برگردان طبیعی۶۴)
    سرچاپ فشرده سازی.بافر به پایه۶۴(ب)، پروتوباف.ساخت برچسب(۱، ۰)، پروتوباف.ساخت برچسب(۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن برچسب(ب، ۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(ب، "سلام")
    پروتوباف.نوشتن برچسب(ب، ۳، پروتوباف.نوع سیم ثابت۳۲)
    پروتوباف.نوشتن ثابت۳۲(ب، ۷ برگردان طبیعی۳۲)
    پروتوباف.نوشتن برچسب(ب، ۴، پروتوباف.نوع سیم ثابت۶۴)
    پروتوباف.نوشتن ثابت۶۴(ب، ۹ برگردان طبیعی۶۴)
    پروتوباف.نوشتن اعشار۳۲(ب، ۰.۵)
    پروتوباف.نوشتن اعشار۶۴(ب، ۲.۲۵)
    پروتوباف.نوشتن بایت‌های طول‌دار(ب، ب.داده، ۲)
    ناپایا خ := فشرده سازی.خواننده از بافر(ب)
    ناپایا سالم := درست
    ناپایا شماره := ۰
    ناپایا سیم := ۰
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، سیم، پروتوباف.خواندن عدد متغیر(خ، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، پروتوباف.خواندن رشته طول‌دار(خ، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    پروتوباف.رد کردن فیلد(خ، سیم، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، پروتوباف.خواندن ثابت۶۴(خ، سالم)
    سرچاپ پروتوباف.خواندن اعشار۳۲(خ، سالم)، پروتوباف.خواندن اعشار۶۴(خ، سالم)
    ب۲ := پروتوباف.خواندن بافر طول‌دار(خ، سالم)
    سرچاپ فشرده سازی.طول بافر(ب۲)، سالم
    _ := پروتوباف.خواندن عدد متغیر(خ، سالم)
    سرچاپ سالم
    سرچاپ پروتوباف.کدگذاری زیگزاگ۳۲(-۱)، پروتوباف.کدگشایی زیگزاگ۳۲(۳ برگردان طبیعی۳۲)، پروتوباف.کدگذاری زیگزاگ۶۴(-۲)، پروتوباف.کدگشایی زیگزاگ۶۴(۴ برگردان طبیعی۶۴)
    ناپایا ب۳ := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن ثابت۳۲(ب۳، ۴۲ برگردان طبیعی۳۲)
    ناپایا خ۳ := فشرده سازی.خواننده از بافر(ب۳)
    سالم = درست
    سرچاپ پروتوباف.خواندن ثابت۳۲(خ۳، سالم)
    فشرده سازی.آزادسازی بافر(ب)
    فشرده سازی.آزادسازی بافر(ب۳)
پایان
خروجیCJYB 8 18 1 0 150 2 سلام 4 9 0.5 2.25 2 true false 1 -2 3 2 42

نوع نشانه‌ها PTK_…

مقدار kind نشانه‌های نشانه گذاری.
نامانگلیسیمقدار
نشانه اتمامPTK_EOF0
نشانه شناسهPTK_IDENT1
نشانه عدد صحیحPTK_INT2
نشانه عدد اعشاریPTK_FLOAT3
نشانه رشتهPTK_STRING4
نشانه نقطه‌ویرگولPTK_SEMI5
نشانه آکولاد بازPTK_LBRACE6
نشانه آکولاد بستهPTK_RBRACE7
نشانه پرانتز بازPTK_LPAREN8
نشانه پرانتز بستهPTK_RPAREN9
نشانه کروشه بازPTK_LBRACKET10
نشانه کروشه بستهPTK_RBRACKET11
نشانه زاویه بازPTK_LANGLE12
نشانه زاویه بستهPTK_RANGLE13
نشانه مساویPTK_EQ14
نشانه ویرگولPTK_COMMA15
نشانه نقطهPTK_DOT16
نشانه منهاPTK_MINUS17
نشانه خطاPTK_ERROR18

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

تابع‌ها

نام نوع فیلد FieldKindName

تابع نام نوع فیلد(k: صحیح): رشته
نام نوع فیلد، مثل int64.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نوع ساده از نام ScalarKindFromName

تابع نوع ساده از نام(name: رشته): صحیح
نوع فیلد از نام گونه‌ی ساده؛ برای نام پیام، صفر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

تجزیه پرونده ParseFile

تابع تجزیه پرونده(source: رشته، ok &: منطقی): پرونده پروتو
متن .proto (نحو proto3) را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نشانه گذاری Tokenize

تابع نشانه گذاری(source: رشته، ok &: منطقی): جریان نشانه پروتو
متن را به نشانه‌ها می‌شکند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

تولید کد GenerateSingle

تابع تولید کد(protoSource: رشته، ok &: منطقی): رشته
از متن .proto کد سلام می‌سازد: یک ساختار برای هر پیام، با تابع‌های سریال‌سازی. فیلدهای پیام، شمارشی و map کنار گذاشته می‌شوند و خواننده‌ی ساخته‌شده عددهای تکراری را فشرده‌نشده انتظار دارد.
encoding-protobuf-Generate.salam
واردسازی کدگذاری.پروتوباف
واردسازی رشته

تابع ریشه:
    منبع := "syntax = \"proto3\";\nmessage Ping { string text = 1; }\nservice Echo {\n  rpc Say (Ping) returns (Ping);\n  rpc Stream (stream Ping) returns (stream Ping);\n}\n"
    ناپایا خوب := نادرست
    کد := پروتوباف.تولید کد(منبع، خوب)
    سرچاپ خوب، رشته.شامل است(کد، "struct Ping")
    پ := پروتوباف.تجزیه پرونده(منبع، خوب)
    سرچاپ پروتوباف.تعداد سرویس‌ها(پ)، پروتوباف.نام سرویس(پ، ۰)، پروتوباف.تعداد متدهای سرویس(پ، ۰)
    سرچاپ پروتوباف.امضای متد(پ، ۰، ۰)
    سرچاپ پروتوباف.امضای متد(پ، ۰، ۱)
    سرچاپ رشته.شامل است(پروتوباف.تولید سرویس‌ها(پ)، "Echo")
    همه := پروتوباف.تولید با سرویس‌ها(منبع، خوب)
    سرچاپ خوب، رشته.طول(همه) > رشته.طول(کد)
    سرچاپ پروتوباف.خلاصه سرویس(منبع، خوب)
پایان
خروجیtrue true 1 Echo 2 Say(Ping) returns (Ping) Stream(stream Ping) returns (stream Ping) true true true service Echo (2 methods) rpc Say(Ping) returns (Ping) rpc Stream(stream Ping) returns (stream Ping)

تعداد سرویس‌ها ServiceCount

تابع تعداد سرویس‌ها(f: پرونده پروتو): صحیح
تعداد سرویس‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

نام سرویس ServiceNameAt

تابع نام سرویس(f: پرونده پروتو، i: صحیح): رشته
نام سرویس شماره‌ی i.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تعداد متدهای سرویس ServiceMethodCount

تابع تعداد متدهای سرویس(f: پرونده پروتو، i: صحیح): صحیح
تعداد متدهای یک سرویس.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

امضای متد ServiceMethodSignature

تابع امضای متد(f: پرونده پروتو، si: صحیح، mi: صحیح): رشته
امضای یک متد، مثل Say(Ping) returns (Ping).

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تولید سرویس‌ها GenerateServices

تابع تولید سرویس‌ها(f: پرونده پروتو): رشته
کد رابط سرویس‌ها را می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تولید با سرویس‌ها GenerateWithServices

تابع تولید با سرویس‌ها(protoSource: رشته، ok &: منطقی): رشته
کد پیام‌ها و سرویس‌ها را با هم می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

خلاصه سرویس ServiceSummary

تابع خلاصه سرویس(protoSource: رشته، ok &: منطقی): رشته
خلاصه‌ی خوانای سرویس‌ها و متدها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

ساخت برچسب MakeTag

تابع ساخت برچسب(fieldNum: صحیح، wireType: صحیح): طبیعی۶۴
برچسب فیلد: شماره‌ی فیلد و نوع سیم در یک عدد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن عدد متغیر WriteVarint

تابع نوشتن عدد متغیر(buf &: compress.ByteBuf، n: طبیعی۶۴)
عدد را با کدگذاری متغیر‌طول (varint) می‌نویسد: هر بایت ۷ بیت، عددهای کوچک کوتاه‌تر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن عدد متغیر ReadVarint

تابع خواندن عدد متغیر(r &: compress.ByteReader، ok &: منطقی): طبیعی۶۴
یک varint را به شکل طبیعی۶۴ می‌خواند؛ اگر بایت‌ها تمام شوند ok نادرست می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن برچسب WriteTag

تابع نوشتن برچسب(buf &: compress.ByteBuf، fieldNum: صحیح، wireType: صحیح)
برچسب را به شکل عدد متغیر می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن برچسب ReadTag

تابع خواندن برچسب(r &: compress.ByteReader، fieldNum &: صحیح، wireType &: صحیح، ok &: منطقی)
برچسب را می‌خواند و شماره‌ی فیلد و نوع سیم را جدا می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگذاری زیگزاگ۳۲ ZigZagEncode32

تابع کدگذاری زیگزاگ۳۲(n: صحیح۳۲): طبیعی۳۲
کدگذاری زیگزاگ: عددهای منفی کوچک را به عددهای مثبت کوچک می‌برد تا varint کوتاهی داشته باشند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگشایی زیگزاگ۳۲ ZigZagDecode32

تابع کدگشایی زیگزاگ۳۲(n: طبیعی۳۲): صحیح۳۲
زیگزاگ ۳۲ بیتی را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگذاری زیگزاگ۶۴ ZigZagEncode64

تابع کدگذاری زیگزاگ۶۴(n: صحیح۶۴): طبیعی۶۴
کدگذاری زیگزاگ ۶۴ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگشایی زیگزاگ۶۴ ZigZagDecode64

تابع کدگشایی زیگزاگ۶۴(n: طبیعی۶۴): صحیح۶۴
زیگزاگ ۶۴ بیتی را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن ثابت۳۲ WriteFixed32

تابع نوشتن ثابت۳۲(buf &: compress.ByteBuf، v: طبیعی۳۲)
عدد ۳۲ بیتی را به شکل ۴ بایت کوچک‌انتها می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن ثابت۳۲ ReadFixed32

تابع خواندن ثابت۳۲(r &: compress.ByteReader، ok &: منطقی): طبیعی۳۲
۴ بایت را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن ثابت۶۴ WriteFixed64

تابع نوشتن ثابت۶۴(buf &: compress.ByteBuf، v: طبیعی۶۴)
عدد ۶۴ بیتی را به شکل ۸ بایت می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن ثابت۶۴ ReadFixed64

تابع خواندن ثابت۶۴(r &: compress.ByteReader، ok &: منطقی): طبیعی۶۴
۸ بایت را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن اعشار۳۲ WriteFloat

تابع نوشتن اعشار۳۲(buf &: compress.ByteBuf، v: اعشار۶۴)
عدد اعشاری ۳۲ بیتی را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن اعشار۳۲ ReadFloat

تابع خواندن اعشار۳۲(r &: compress.ByteReader، ok &: منطقی): اعشار۶۴
عدد اعشاری ۳۲ بیتی را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن اعشار۶۴ WriteDouble

تابع نوشتن اعشار۶۴(buf &: compress.ByteBuf، v: اعشار۶۴)
عدد اعشاری ۶۴ بیتی را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن اعشار۶۴ ReadDouble

تابع خواندن اعشار۶۴(r &: compress.ByteReader، ok &: منطقی): اعشار۶۴
عدد اعشاری ۶۴ بیتی را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن بایت‌های طول‌دار WriteLenPrefixedBytes

تابع نوشتن بایت‌های طول‌دار(buf &: compress.ByteBuf، p: تهی*، n: صحیح)
طول و سپس بایت‌ها را می‌نویسد؛ برای فیلدهای bytes و پیام‌های درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن رشته طول‌دار WriteLenPrefixedStr

تابع نوشتن رشته طول‌دار(buf &: compress.ByteBuf، s: رشته)
طول و سپس رشته را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن بافر طول‌دار ReadLenPrefixedBuf

تابع خواندن بافر طول‌دار(r &: compress.ByteReader، ok &: منطقی): compress.ByteBuf
یک بخش طول‌دار را به بافر می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن رشته طول‌دار ReadLenPrefixedStr

تابع خواندن رشته طول‌دار(r &: compress.ByteReader، ok &: منطقی): رشته
یک بخش طول‌دار را به رشته می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

رد کردن فیلد SkipField

تابع رد کردن فیلد(r &: compress.ByteReader، wireType: صحیح، ok &: منطقی)
از روی مقدار یک فیلد با نوع سیم داده‌شده رد می‌شود؛ برای فیلدهای ناشناخته.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam