What is a Blob?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

What is a Blob?

Tony Mechelynck
I see that since Vim 8.1.765, there is a new type, the Blob. But what
is a Blob, exactly? What is it good for? I gather from the help that a
Blob is defined as any string of 0 or more hex bytes, including null
bytes if desired, and that a Blob can be created by assigning it
either a Blob literal (0z or 0Z followed by any even number of hex
digits) or the value of another Blob.

:echo displays a Blob as a List of numbers in hex, e.g. ":echo
0z00112233445566778899AABBCCDDEEFF" (without the double quotes) gives
[0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA,
0xBB, 0xCC, 0xDD, 0xEE, 0xFF] but a Blob cannot be treated as either a
List or a String: ":echo ['Mary', 'had', 'a', 'little', 'lamb'] +
0z12345678" gives E745: Using a List as a Number (sic) while "echo
'Mary had a little lamb' . 0z12345678" gives E976: Using a Blob as a
String. But ":echo 0z01234567 + 0z89ABCDEF" gives [0x01, 0x23, 0x45,
0x67, 0x89, 0xAB, 0xCD, 0xEF].

I have read somewhere in the help that blob[n] is the, er, (n-1)th
byte I think, of the Blob, but experiment shows that it is returned as
a Number, not a Blob; and that blob[i:j] returns a Blob containing all
bytes from blob[i] to blob[j] inclusive, and experiment shows that in
this case the result is indeed a Blob; but neither blob + blob nor
blob[i] with a single index are covered (yet) under :h
expression-syntax and its subtags AFAICT. So what other operations are
possible? Ah yes: Blobs can be tested for equality (i.e. :echo
0zabcdef == 0zABCDEF returns 1) and for emptyness (:echo empty(0z)
returns 1 but :echo empty(0z00) returns 0) but not for comparison
(:echo 0z123456 < 0zABCDEF returns E978: Invalid operation for Blob).
What else?


Best regards,
Tony.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: What is a Blob?

Bram Moolenaar

Tony wrote:

> I see that since Vim 8.1.765, there is a new type, the Blob. But what
> is a Blob, exactly? What is it good for? I gather from the help that a
> Blob is defined as any string of 0 or more hex bytes, including null
> bytes if desired, and that a Blob can be created by assigning it
> either a Blob literal (0z or 0Z followed by any even number of hex
> digits) or the value of another Blob.
>
> :echo displays a Blob as a List of numbers in hex, e.g. ":echo
> 0z00112233445566778899AABBCCDDEEFF" (without the double quotes) gives
> [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA,
> 0xBB, 0xCC, 0xDD, 0xEE, 0xFF] but a Blob cannot be treated as either a
> List or a String: ":echo ['Mary', 'had', 'a', 'little', 'lamb'] +
> 0z12345678" gives E745: Using a List as a Number (sic) while "echo
> 'Mary had a little lamb' . 0z12345678" gives E976: Using a Blob as a
> String. But ":echo 0z01234567 + 0z89ABCDEF" gives [0x01, 0x23, 0x45,
> 0x67, 0x89, 0xAB, 0xCD, 0xEF].
>
> I have read somewhere in the help that blob[n] is the, er, (n-1)th
> byte I think, of the Blob, but experiment shows that it is returned as
> a Number, not a Blob; and that blob[i:j] returns a Blob containing all
> bytes from blob[i] to blob[j] inclusive, and experiment shows that in
> this case the result is indeed a Blob; but neither blob + blob nor
> blob[i] with a single index are covered (yet) under :h
> expression-syntax and its subtags AFAICT. So what other operations are
> possible? Ah yes: Blobs can be tested for equality (i.e. :echo
> 0zabcdef == 0zABCDEF returns 1) and for emptyness (:echo empty(0z)
> returns 1 but :echo empty(0z00) returns 0) but not for comparison
> (:echo 0z123456 < 0zABCDEF returns E978: Invalid operation for Blob).
> What else?

The main reason for supporting a Blob is to deal with raw data.  That
can be an image, sound file, etc.  Normally these would only be moved
around.  E.g., read it from a file and send it on a channel.

In some cases it is useful to manupliate the Blob, e.g. concatenate or
split it up.  The use of this is limited.  However, since a Blob mostly
behaves as a List of bytes, Yasuhiro added several operations that are
available for List.

I have to admit that it's quite a bit of code for something that isn't
going to be used much.  But when a plugin needs to manipulate binary
data, it's essintial.

--
hundred-and-one symptoms of being an internet addict:
189. You put your e-mail address in the upper left-hand corner of envelopes.

 /// Bram Moolenaar -- [hidden email] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Fwd: What is a Blob?

Tony Mechelynck
On Sun, Jan 13, 2019 at 5:04 PM Bram Moolenaar <[hidden email]> wrote:

>
>
> Tony wrote:
>
> > I see that since Vim 8.1.765, there is a new type, the Blob. But what
> > is a Blob, exactly? What is it good for? I gather from the help that a
> > Blob is defined as any string of 0 or more hex bytes, including null
> > bytes if desired, and that a Blob can be created by assigning it
> > either a Blob literal (0z or 0Z followed by any even number of hex
> > digits) or the value of another Blob.
> >
> > :echo displays a Blob as a List of numbers in hex, e.g. ":echo
> > 0z00112233445566778899AABBCCDDEEFF" (without the double quotes) gives
> > [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA,
> > 0xBB, 0xCC, 0xDD, 0xEE, 0xFF] but a Blob cannot be treated as either a
> > List or a String: ":echo ['Mary', 'had', 'a', 'little', 'lamb'] +
> > 0z12345678" gives E745: Using a List as a Number (sic) while "echo
> > 'Mary had a little lamb' . 0z12345678" gives E976: Using a Blob as a
> > String. But ":echo 0z01234567 + 0z89ABCDEF" gives [0x01, 0x23, 0x45,
> > 0x67, 0x89, 0xAB, 0xCD, 0xEF].
> >
> > I have read somewhere in the help that blob[n] is the, er, (n-1)th
> > byte I think, of the Blob, but experiment shows that it is returned as
> > a Number, not a Blob; and that blob[i:j] returns a Blob containing all
> > bytes from blob[i] to blob[j] inclusive, and experiment shows that in
> > this case the result is indeed a Blob; but neither blob + blob nor
> > blob[i] with a single index are covered (yet) under :h
> > expression-syntax and its subtags AFAICT. So what other operations are
> > possible? Ah yes: Blobs can be tested for equality (i.e. :echo
> > 0zabcdef == 0zABCDEF returns 1) and for emptyness (:echo empty(0z)
> > returns 1 but :echo empty(0z00) returns 0) but not for comparison
> > (:echo 0z123456 < 0zABCDEF returns E978: Invalid operation for Blob).
> > What else?
>
> The main reason for supporting a Blob is to deal with raw data.  That
> can be an image, sound file, etc.  Normally these would only be moved
> around.  E.g., read it from a file and send it on a channel.
>
> In some cases it is useful to manupliate the Blob, e.g. concatenate or
> split it up.  The use of this is limited.  However, since a Blob mostly
> behaves as a List of bytes, Yasuhiro added several operations that are
> available for List.
>
> I have to admit that it's quite a bit of code for something that isn't
> going to be used much.  But when a plugin needs to manipulate binary
> data, it's essintial.
>
> --
> hundred-and-one symptoms of being an internet addict:
> 189. You put your e-mail address in the upper left-hand corner of envelopes.

I see the general idea, but _please_ fill up (or have Yatsuhiro fill
up) the documentation, e.g. please mention all possible Blob operators
under |expr1| to |expr9|. Also mention Blobs in the description of any
functions that accept them: I found empty(), but are there others?
string2blob() or blob2list() might perhaps be interesting unless they
could be done by auto-conversion. I see test_null_blob() but what is
the difference between its output and 0z ? Or is that function to be
used only in "assert_equal(0z, test_null_blob())"? Please also flesh
up the info under |Blob|, which at the moment is not very informative
to say the least.

Best regards,
Tony.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.