نوع داده ای byte و bytearray

با عرض سلام
میشه بگید نوع داده ای byte و byte array چیه ؟ و کجا ازشون استفاده میشه ؟
اگه میشه یه مثال واقعی بزنید

byte که خوب یه بایت ( ۸ بیت )‌ هست. و bytearray همه یه آرایه از یه سری بایت. وقتی نیاز دارید که با فرم باینری دیتا کار کنین به کارتون میان

2 Likes
The syntax of bytearray() method is:

bytearray([source[, encoding[, errors]]])

bytearray() Parameters
The bytearray() takes three optional parameters:

source (Optional) - source to initialize the array of bytes.
encoding (Optional) - if source is a string, the encoding of the string.
errors (Optional) - if source is a string, the action to take when the encoding conversion fails (Read more: String encoding)


توضیحات و مثال مربوطه رو از این لینک میتونید مشاهده کنید:

1 Like

ببخشید من متوجه نمیشم

الان این کد می نویسم

x = bytes(4)
print (x)

اینو جواب میده

b'\x00\x00\x00\x00'`

خب این یعنی چی و به چه دردی می خوره ؟

1 Like

تمام مدتی که پایتون کار کردم فعلا نیازی به استفادش نداشتم ولی قطعا کاربرد استفاده داره در سطح های پایین تر مثل تایپ دیتا . :crazy_face:

 A  `bytearray`  is very similar to a regular python string ( `str`  in python2.x,  `bytes`  in python3) but with an important difference, whereas strings are  *immutable* ,  `bytearray` s are mutable, a bit like a  `list`  of single character strings.

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


This is useful because some applications use byte sequences in ways that perform poorly with immutable strings. When you are making lots of little changes in the middle of large chunks of memory, as in a database engine, or image library, strings perform quite poorly; since you have to make a copy of the whole (possibly large) string.  `bytearray` s have the advantage of making it possible to make that kind of change without making a copy of the memory first.

But this particular case is actually more the exception, rather than the rule. Most uses involve comparing strings, or string formatting. For the latter, there's usually a copy anyway, so a mutable type would offer no advantage, and for the former, since immutable strings cannot change, you can calculate a  `hash`  of the string and compare that as a shortcut to comparing each byte in order, which is almost always a big win; and so it's the immutable type ( `str`  or  `bytes` ) that is the default; and  `bytearray`  is the exception when you need it's special features.

http://dabeaz.blogspot.com/2010/01/few-useful-bytearray-tricks.html
Suppose you’re writing some network code that is receiving a large message on a socket connection

Example 1: Assembling a message from fragments
Suppose you're writing some network code that is receiving a large message on a socket connection. If you know about sockets, you know that the recv() operation doesn't wait for all of the data to arrive. Instead, it merely returns what's currently available in the system buffers. Therefore, to get all of the data, you might write code that looks like this:

# remaining = number of bytes being received (determined already)
msg = b""
while remaining > 0:
    chunk = s.recv(remaining)    # Get available data
    msg += chunk                 # Add it to the message
    remaining -= len(chunk)  
The only problem with this code is that concatenation (+=) has horrible performance. Therefore, a common performance optimization in Python 2 is to collect all of the chunks in a list and perform a join when you're done. Like this:
# remaining = number of bytes being received (determined already)
msgparts = []
while remaining > 0:
    chunk = s.recv(remaining)    # Get available data
    msgparts.append(chunk)       # Add it to list of chunks
    remaining -= len(chunk)  
msg = b"".join(msgparts)          # Make the final message
Now, here's a third solution using a bytearray:
# remaining = number of bytes being received (determined already)
msg = bytearray()
while remaining > 0:
    chunk = s.recv(remaining)    # Get available data
    msg.extend(chunk)            # Add to message
    remaining -= len(chunk)  
Notice how the bytearray version is really clean. You don't collect parts in a list and you don't perform that cryptic join at the end. Nice.

Of course, the big question is whether or not it performs. To test this out, I first made a list of small byte fragments like this:

chunks = [b"x"*16]*512
I then used the timeit module to compare the following two code fragments:
# Version 1
msgparts = []
for chunk in chunks:
    msgparts.append(chunk)
msg = b"".join(msgparts)

# Version 2
msg = bytearray()
for chunk in chunks:
    msg.extend(chunk)
When tested, version 1 of the code ran in 99.8s whereas version 2 ran in 116.6s (a version using += concatenation takes 230.3s by comparison). So while performing a join operation is still faster, it's only faster by about 16%. Personally, I think the cleaner programming of the bytearray version might make up for it.

https://pyvideo.org/pycon-us-2010/pycon-2010--mastering-python-3-i-o.html

2 Likes

image

:sweat_smile:

خوب، در حقیقت \x00 یعنی «صفر باینری» (به شکل hex نشون داده شده). این الآن یه چیزی شبیه placeholder درست کرده که بعدا با دیتایی که داریم جاهای خالی رو پر کنیم (مثلا!)
یک متغیر با سایز مشخص، که میتونیم بعدا پرش کنیم.

منم تا حالا از این استفاده نکردم. ولی مثلا برای ساخت یه لایبرری که یه سری فایل رو به صورت باینری از روی هارد بخونه و بنویسه کاربرد داره (مثلا اگه بخواید یه لایبرری کار با عکس بسازید که خوندن و نوشتنش به شکل باینری هست، نه مثل فایل تکست که sttring باشه.)

1 Like

فکر می کنم مثلا یک عکس بخوام بخونم و داخل دیتابیس ذخیره کنم باید عکس را به صورت آرایی از بایت باینری در بیارم بعدش بریز توی دیتابیس , درسته ؟

نه. اون کار یه کم فرق میکنه و البته کاملا غلطه. هیچوقت نباید همچین چیزایی رو توی دیتابیس نگه داشت. باعث میشه بعد از چندماه که پروژه کار میکنه، حجم دیتابیس به جای ۱مگابایت، بشه ۲گیگابایت!
برای اون کار میشه همچین کدی نوشت:

with open("img.png", "rb") as image:
  f = image.read()
  b = bytearray(f)

ولی منظور من، مثلا خوندن png از روی دیسک و تبدیلش به pixel array هست و بعد از اینکه ویرایشهامون رو انجام دادیم، تبدیل دوباره‌ی pixel array به byte و ریختنش توی هارد. خیلی سختتر از خوندن و نوشتن فایل معمولیه.

2 Likes

البته بستگی به database داره

خوب من درمورد sql-basedها گفتم.
چه دیتابیسی با اینجور ورودیها خوب عمل میکنه؟

Hbase
تنها data type که داره Array byte هستش و تبدیل کردن به type های دیگه رو باید شما در برنامه خودت انجام بدی
خیلی ها file و بصورت array byte در hbase ذخیره میکنند یا با protobuf
تایپ های دیگه رو به array byte تبدیل میکنند و بعد در hbase ذخیره میکنند

2 Likes