Argumen byteorder adalah tanda byteorder yang digunakan, persis seperti format string. Anda juga dapat menentukannya menggunakan atribut byteorder dari objek-objek ini
Anda dapat dengan mudah mensubklasifikasikannya untuk membuat kelas pembaca atau penulis untuk format yang Anda inginkan
Kedua objek ini memiliki metode pack, unpack dan unpack_from, yang persis sama dengan level modul, tetapi jika urutan byte tidak ditentukan dalam struktur, defaultnya adalah atribut byteorder alih-alih “@”
Pertama, objek TypeReader dapat membaca elemen dari objek mirip byte atau mirip file. Ini memiliki metode berikut
bit[n, bit, panjang=1]Mengembalikan bit yang ditentukan dalam bilangan bulat n. Mengembalikan [panjang] bit
camilan [n]Mengembalikan camilan tinggi dan rendah dari sebuah byte
ditandatangani_nibbles[n]Mengembalikan camilan bertanda tinggi dan rendah dari sebuah byte
Semua metode lainnya membutuhkan 2 argumen
TypeReader. uint8[data, ptr=0]
ptr adalah offset untuk mulai membaca. Jika Tidak Ada, pembacaan dimulai pada posisi file saat ini [diberikan oleh file. kirim []], atau pada 0 jika data adalah objek seperti byte. Semua metode lainnya mengembalikan [unpacked, ptr], di mana unpacked adalah elemen yang belum dibongkar, dan ptr adalah offset tempat pembacaan berakhir
Objek TypeReader memiliki metode berikut
uint8[data, ptr=None] uint16[data, ptr=None] uint24[data, ptr=None] uint32[data, ptr=None] uint64[data, ptr=None] int8[data, ptr=None] int16[data, ptr=None] int24[data, ptr=None] int32[data, ptr=None] int64[data, ptr=None] float32[data, ptr=None] = float[...] double[data, ptr=None] #64 bits double string[data, ptr=None] #null-terminated string, like the "n" format character utf16string[data, ptr=None] #null-terminated UTF-16 string
Kemudian, objek TypeWriter dapat mengemas beberapa elemen. Ini memiliki metode berikut. [argumen data adalah elemen untuk dikemas, dapat berupa objek seperti file keluaran]
Saya perlu menghasilkan data biner yang dikemas yang mencakup null-dihentikan
string dicampur dengan bilangan biner. Misalnya, string Python
"foo" harus menjadi string biner 4 karakter "foo\0", seperti a
C string [jangan tanya, saya tidak mendesain protokolnya]
Apa cara terbaik untuk melakukan ini?
memberi saya string dengan panjang tetap, non-null-terminasi. Sekarang saya lakukan
s1 = diri sendiri. direktori + "\0"
s2 = diri sendiri. nama file + "\0"
s3 = diri sendiri. dateString + "\0"
s4 = diri sendiri. nama + "\0"
s5 = struktur. Pak [". IB", diri. id, diri. perTargetFlag]
data = s1 + s2 + s3 + s4 + s5
yang cukup jelek. Apakah ada cara yang lebih rapi untuk melakukan ini?
Saya tahu penambahan string bukanlah cara yang paling efisien, tetapi untuk
aplikasi ini, saya lebih suka kejelasan dan tidak keberatan dengan kecepatan minor
memukul
Jum 3 Agustus 09. 37. 07 EDT 2001
Hi, Quoted from the "Python Library Reference", "4.3 struct -- Interpret strings as packed binary data": "For the "s" format character, the count is interpreted as the size of the string, not a repeat count like for the other format characters; e.g. '10s' means a single 10-byte string, while '10c' means 10 characters. For packing, the string is truncated or padded with null bytes as appropriate to make it fit. For unpacking, the resulting string always has exactly the specified number of bytes. As a special case, '0s' means a single, empty string [while '0c' means 0 characters]." So, the 'fmt' string defines the length of the containing string, not the [if any] terminating null. HTH, Hans "Xavier Defrang" wrote in message news:mailman.996832925.27921.python-list at python.org... > > Hello, > > How do I unpack a null-terminated string with the struct module? I > couldn't find it in the lib reference.. maybe do i have to upgrade my > glasses? > > Thanks in advance, > > Xavier Defrang > Perceval R&D Team > xavier at perceval.net > > ------------------------------------------------- > Perceval Technologies SA/NV Tel: +32-2-6409194 > Rue Tenbosch, 9 Fax: +32-2-6403154 > B-1000 Brussels //www.perceval.net > BELGIUM info at perceval.net > ------------------------------------------------- > >_Informasi lebih lanjut tentang milis daftar-Python
Dibuat pada 19-01-2017 18. 24 oleh Elizacat, terakhir diubah 11-04-2022 14. 58 oleh administrator. Masalah ini sekarang ditutup
- [lihat]Pengarang. Elizabeth Myers [Elizacat] *Tanggal. 19-01-2017 18. 24There was some discussion on python-ideas about this, and I figured it would be more productive to bring it here since to me this appears to be a glaring omission. The struct module has no capability to support variable-length strings; this includes null-terminated and Pascal-ish strings with a different integer datatype [usually in binary] specifying length. This unfortunate omission makes the struct module extremely unwieldy to use in situations where you need to unpack a lot of variable-length strings, especially iteratively; see //mail.python.org/pipermail/python-ideas/2017-January/044328.html for why. For zero-terminated strings, it is essentially impossible. It's worth noting many modern protocols use variable-length strings, including DHCP. I therefore propose the following extensions to the struct module [details can be bikeshedded over :P]: - Z [uppercase] format specifier [I did not invent this idea, see //github.com/stendec/netstruct - although that uses $], which states the preceding whole-number datatype is the length of a string that follows. - z [lowercase] format specifier, which specifies a null-terminated [also known as C style] string. An optional length parameter can be added to specify the maximum search length. These two additions will make the struct module much more usable in a wider variety of contexts.- [lihat] Penulis. Serhiy Storchaka [serhiy. storcaka] *
Could you provide some examples of using these format specifiers? I suppose that due to limitations of the struct module the way in which they can be implemented would be not particularly useful for you.- [lihat] Penulis. Mark Dickinson [mark. dickinson] *
IMO, as one of the previous maintainers of the struct module, this feature request isn't compatible with the current design and purpose of the struct module. I agree that there's an important problem to solve [and one I've had to solve many times for various formats in consulting work]; it's simply that the struct module isn't the right place to solve it.- [lihat] Penulis. Ethan Furman [ethan. furman] *
From Yury Selivanov: ------------------- This is a neat idea, but this will only work for parsing framed binary protocols. For example, if you protocol prefixes all packets with a length field, you can write an efficient read buffer and use your proposal to decode all of message's fields in one shot. Which is good. Not all protocols use framing though. For instance, your proposal won't help to write Thrift or Postgres protocols parsers. Overall, I'm not sure that this is worth the hassle. With proposal: data, = struct.unpack['!H$', buf] buf = buf[2+len[data]:] with the current struct module: len, = struct.unpack['!H', buf] data = buf[2:2+len] buf = buf[2+len:] Another thing: struct.calcsize won't work with structs that use variable length fields.- [lihat] Penulis. Yury Selivanov [yselivanov] *
Ethan, thanks for moving my reply on the list to here. Also +1 to what Mark said.- [lihat] Penulis. Raymond Hettinger [rhettinger] *
FWIW, I concur with Mark and Yuri that the feature request isn't compatible with the design and purpose of the struct module- [lihat] Penulis. Antoine Pitrou [pitrou] *
To add a bit to what Yury said, even framing isn't always compatible with this proposal. For example, in dask/distributed, we first have a word for the number of frames, then one word per frame to indicate each frame's length, then the frame bodies.- [lihat] Penulis. Elizabeth Myers [Elizacat] *Tanggal. 20-01-2017 23. 15
Hi, After discussing this on the python-ideas ML a bit more, this is actually a feature people want a great deal. It can't cover every use case, but to expand it further than this proposal and make it do so is way beyond the scope of this proposal. It may not be completely useful for every protocol, but it is sufficiently useful for many people who have simpler use cases. There is no reason to prevent the addition of this feature other than what boils down to "well code will have to be written..." I don't buy the argument that it's "outside the scope of the module" more than I think it's more "I don't like the idea of struct being used for non-fixed data." C structures support zero-terminated char arrays, and there is already a Pascal string type. I didn't realise there'd be this much opposition to just adding two format specifiers.. :/- [lihat] Penulis. Elizabeth Myers [Elizacat] *Tanggal. 20-01-2017 23. 24
Also, to add to the discussion: * Rejecting this because "it doesn't cover every use case" is a red herring at best. If this can't cover your use case, odds are the struct module can *never* cover it. That is no reason to reject it alone; you would need something more heavyweight than the struct module anyway. * If the module can't cover your use case with this feature, it can't cover it right now, so why obstruct it? It covers my use cases for it just fine. * Not everyone needs something more heavyweight, or wants to import some bigger module just because they need variable-length strings. * If the real goal is to discourage use of the struct module, too bad. People are actually using it in production and it serves its [rather small] purpose very well. Other people would like to use the module for their use cases, but presently cannot, and this proposal would help cover their particular cases. * The fact that the netstruct module exists with this feature is proof enough there's demand; not to mention the discussion on the python-ideas ML shows that many people already would find this very useful. It's not like I'm proposing adding braces or some horrible huge proposal, I'm adding two format specifiers. *Two.*- [lihat] Penulis. Mark Dickinson [mark. dickinson] *
A couple of questions that haven't been brought up yet: 1. Do you have any thoughts on how alignment should behave for '@'-style structs containing variable-length strings? I suspect the easiest solution may be simply to disallow that combination, and only allow variable-length strings for "standard" struct types [those with a format string starting with one of "=", "", "!"], where alignment isn't an issue. 2. For the Struct object, what should the .size attribute give for a variable-length struct? [Or should accessing the attribute raise an exception?] 3. Any thoughts about how the internal representation of the Struct object would need to change? I guess you'd want to drop the "offset" field of the "formatcode" struct, and compute the offsets on the fly during packing and unpacking [or would you try to keep the offset for the non-variable-length cases?]. You'd probably also want to find a way to encode the information about whether the struct is variable-length or not in the PyStructObject struct. A key requirement here is that there should be no substantial performance regression for packing / unpacking with structs that don't use the variable-length feature. It doesn't seem likely to me that getting rid of the precalculated offset would cause such a regression, but it's something that should be checked.- [lihat] Penulis. Serhiy Storchaka [serhiy. storchaka] *
Could you provide some examples of using these format specifiers? I suppose that due to limitations of the struct module the way in which they can be implemented would be not particularly useful for you._0 - [lihat] Penulis. Raymond Hettinger [rhettinger] *
Could you provide some examples of using these format specifiers? I suppose that due to limitations of the struct module the way in which they can be implemented would be not particularly useful for you._1 - [lihat] Penulis. Raymond Hettinger [rhettinger] *
Could you provide some examples of using these format specifiers? I suppose that due to limitations of the struct module the way in which they can be implemented would be not particularly useful for you._2 - [lihat] Penulis. Alex Waygood [AlexWaygood] *
Could you provide some examples of using these format specifiers? I suppose that due to limitations of the struct module the way in which they can be implemented would be not particularly useful for you._3