tipe data python terkecil untuk obrolan soket

Apa "paket" terkecil yang dapat dikirim melalui modul soket? Saya hanya perlu mengirim 16 bit data, 2 byte dan itu adalah sesuatu yang harus saya kirim dengan cepat jadi saya ingin datanya sekecil mungkin. Saya telah melakukan beberapa "percobaan" untuk menemukan ukuran terkecil, tidak ada yang saya dapatkan kurang dari 28 byte.

Hasil tes:

sys.getsizeof(2) = 28

sys.getsizeof(0b0001) = 28

sys.getsizeof(bytes(0b0001)) = 34

sys.getsizeof('0001') = 66

sys.getsizeof('a') = 60

sys.getsizeof(0b0001000100010001000100010001) = 28

sys.getsizeof(0b000100010001000100010001000100010001) = 32

Saya hanya ingin tahu apakah itu memang yang terkecil yang bisa saya kirimkan.


Saya juga ingin menambahkan bahwa python sangat sulit untuk bekerja dengan biner. Saya tahu ini tidak relevan seperti dulu, tetapi untuk beberapa hal ini berguna. Saya mengatakan ini karena dua alasan:

1) Sepertinya saya tidak bisa menyimpan variabel biner, variabel selalu kembali ke integer atau tipe lainnya.

2) Setelah pengujian saya melakukan konversi biner ke byte dan mendapatkan ukurannya:

sys.getsizeof(bytes(0b0001001001001001001001001)) = 2396778

person user1642826    schedule 06.09.2012    source sumber
comment
ini adalah nilai yang bergantung pada sistem pada sistem saya sizeof('a') = 25 dan `sizeof(2) = 12   -  person Joran Beasley    schedule 07.09.2012
comment
Jadi apakah ada cara untuk memaksa soket hanya mengambil dua bit?   -  person user1642826    schedule 07.09.2012


Jawaban (3)


sys.getsizeof mengembalikan ukuran internal int Python, bukan int C. Anda dapat menggunakan struct.pack untuk mendapatkan byte C:

>>> import struct
>>> struct.pack('H',32768)  # default endian-ness
'\x00\x80'
>>> struct.pack('>H',32768)  # force big-endian
'\x80\x00'

Untuk mengirim dua byte eksplisit:

>>> struct.pack('BB',100,200)
'd\xc8'

Perhatikan bahwa byte direpresentasikan dalam sebuah string. 'd' adalah karakter ASCII untuk 100 dan \xc8 adalah notasi heksadesimal untuk 200:

>>> ord('d')
100
>>> 0xc8
200

Anda bisa mendapatkan ukuran paket yang dibuat dengan .pack. Misalnya ukuran dua celana pendek dan satu panjang:

>>> struct.calcsize('>HHL')
8

Lihat dokumentasi modul struct.

person Mark Tolonen    schedule 07.09.2012
comment
Terima kasih, itulah yang saya cari. - person user1642826; 07.09.2012
comment
Besar! Jika jawaban diterima, klik tanda centang hijau di sebelah kiri. Selamat datang di Stack Overflow! - person Mark Tolonen; 07.09.2012

Mengatasi bagian kedua dari pertanyaan Anda:

"biner" adalah representasi bilangan bulat, bukan tipe. Anda dapat menggunakan bin() untuk mendapatkan representasi biner sebagai string. Anda dapat mengonversi representasi string biner menjadi int menggunakan.... int(). misalnya

>>> x = 1234
>>> bin(x)
'0b10011010010'     # note, this is a string
>>> print int(bin(x), 2)
1234

Untuk bagian kedua menurut saya Anda pasti salah:

>>> bytes(0b0001001001001001001001001)
'2396745'
>>> sys.getsizeof(bytes(0b0001001001001001001001001))
44
person mhawke    schedule 07.09.2012

Jumlah byte yang dikirim melalui soket bergantung pada lebih dari sekadar ukuran nilai data dalam bahasa pemrograman. Misalnya, mengirimkan satu byte melalui koneksi TCP baru ke "www.google.com:80" menghasilkan aliran paket berikut:

A->B: 64 byte TCP SYN
B->A: 60 byte TCP SYN+ACK
A->B: 52 byte TCP ACK
A->B: 53 byte TCP packet containing a single byte payload
B->A: 52 byte TCP ACK
A->B: 52 byte TCP FIN
B->A: 52 byte TCP FIN+ACK
A->B: 52 byte TCP FIN

Jadi totalnya 437 byte untuk mengirim satu byte payload. UDP sedikit lebih pemaaf sehingga hanya 29 byte yang dikirim untuk satu byte payload. Anda dapat menekan payload hingga 21 byte jika Anda menggunakan soket mentah.

Bagaimanapun, mengurangi jumlah byte dalam payload menjadi 1 dan menggunakan protokol minimal (misalnya, UDP dalam banyak kasus) adalah hal terbaik yang akan Anda dapatkan. Ukuran kuncinya adalah:

IP Header = 20 bytes
IP Header + UDP Header = 20 + 8 = 28 bytes
IP Header + TCP Header = 20 + 20 = 40 bytes

Semua protokol jaringan membatasi jumlah byte payload menjadi byte utuh.

Hal lain yang perlu diingat adalah bahwa di bawah header IP, Anda memiliki lapisan fisik apa pun yang mendasarinya. Dalam kasus Ethernet standar, Anda akan mendapatkan semuanya yang terpecah menjadi paket 1500 byte. Tidak masalah jika Anda mengirim 1 byte atau 1000 byte, Anda akhirnya mengirim 1500 byte melalui kabel. Tentu saja ini merupakan penyederhanaan yang berlebihan, tetapi idenya seharusnya sudah tertanam - jika Anda beroperasi pada Ethernet standar maka saya tidak akan terlalu khawatir tentang pengiriman beberapa byte. Batasi penggunaan Anda pada UDP jika Anda tidak memerlukan pengakuan.

Jika Anda benar-benar tertarik, dapatkan salinan seri Ilustrasi TCP/IP yang suci.

person D.Shawley    schedule 08.09.2012