Ketik casting antara char* dan UBYTE* (unsigned char*)

Latar Belakang: Saya menerima array sebagai char* sebagai bagian dari sesi soket. Sekarang kita harus mencocokkan Token (header HTTP) darinya. Kode di sini adalah kita telah membuat UBYTE* dan mendapatkan nilai dari array char setelah mengetik dengan UBYTE. Nanti pointer UBYTE yang sama kita lewati ke fungsi lain yang menerima char* setelah mengetikkannya ke char*.

Masalahnya di sini adalah ini berfungsi dalam versi rilis dan bukan dalam versi debug (dengan -g dan optimasi berbeda). Tidak hanya menambahkan beberapa cetakan dalam mode debug menyembunyikan masalahnya.

Jadi pertanyaan saya di sini, Apa perbedaan antara penunjuk UByte (yang pada dasarnya adalah karakter yang tidak ditandatangani) dan penunjuk karakter. Mengubah UByte ke char menyelesaikan masalah saya di semua mode tetapi saya tidak punya penjelasan yang sama? Ada pemikiran?


person Aryan    schedule 14.07.2010    source sumber


Jawaban (2)


Tidak ada salahnya melakukan casting antara char * dan unsigned char *. Jika Anda mendapatkan perilaku tidak terduga yang bervariasi tergantung pada tingkat pengoptimalan, pasti ada bug dalam kode Anda, tetapi mungkin tidak ada hubungannya dengan membuang tanda tangan pada pemeran.

Selain itu, UBYTE adalah typedef yang cukup konyol karena terdapat tipe C standar, uint8_t, yang identik dan didefinisikan dalam stdint.h.

person R.. GitHub STOP HELPING ICE    schedule 14.07.2010
comment
@R., sedikit koreksi, keberadaan unit8_t diberlakukan oleh POSIX, bukan oleh C. - person Jens Gustedt; 14.07.2010
comment
C menjamin itu ada jika tipe integer 8bit ada. Jika tidak ada tipe 8bit, maka tidak mungkin untuk mendefinisikan UBYTE Anda sendiri. Karena pertanyaan ini adalah tentang pemrosesan header HTTP, targetnya hampir pasti adalah platform yang dilengkapi untuk menangani unit data jaringan (byte). CHAR_BIT!=8 benar-benar suatu patologi yang tidak layak disebutkan. Hal ini tidak akan pernah terjadi kecuali pada DSP dan mesin lama yang tidak akan pernah menjadi target program portabel. - person R.. GitHub STOP HELPING ICE; 14.07.2010
comment
@R, mereka menamakannya UBYTE tidak berarti lebarnya 8. Ini hanya menunjukkan apa yang mereka harapkan. - person Jens Gustedt; 14.07.2010
comment
Kalau lebarnya tidak 8, maka menamakannya UBYTE 1000x lebih merusak otak dari yang saya kira... - person R.. GitHub STOP HELPING ICE; 14.07.2010

Mungkin Anda bisa menjelaskan sejak awal, mengapa Anda harus menggunakan unsigned char? Dan apa maksudnya tidak berfungsi?

void*, char* dan unsigned char* memiliki semantik yang berbeda dan Anda harus menggunakannya sesuai dengan itu:

  • void* menunjuk ke data yang tidak spesifik sehingga Anda tidak dapat melakukan apa pun kecuali Anda memasukkannya ke tipe nyata
  • char* sayangnya memiliki dua arti berbeda, baik sebagai string teks, atau sebagai data tidak spesifik tetapi dapat ditangani (ditambal) pada tingkat (byte) yang rendah
  • signed char dan unsigned char adalah bilangan bulat lebar kecil yang ingin Anda gunakan untuk melakukan aritmatika
person Jens Gustedt    schedule 14.07.2010
comment
mengapa saya memilih menggunakan char * adalah menggunakan tipe data yang sama secara keseluruhan. Fungsi 1 Memanggil fungsi2 (melewati parameter char*). Fungsi 2 menyalinnya ke Ubyte* lokal. Fungsi 2 memanggil Fungsi 3 (yang menerima char*). Jadi menurut pendapat saya, function2 bertindak sebagai penerusan dari Function1 - Function3 dan secara tidak perlu mengubahnya menjadi UBYTE dengan menambahkan overhead typecasting atau mereferensikan/menghilangkan referensi pointer. PS: Saya tidak melihat masalah logis apa pun dengan Kode saya karena kode saat ini berfungsi di rilis (O2) dan debug (O3,g) + cetakan tambahan dalam fungsi yang bermasalah. - person Aryan; 14.07.2010
comment
Terima kasih Jen atas balasan dan wawasannya. Sekadar memperjelas, bukan berarti saya puas atau semacamnya. Saya memiliki kode tertulis lama di mana orang-orang dari waktu ke waktu telah mengubahnya demi kenyamanan mereka. Dengan Kode Produksi, maksud saya tidak ada masalah logis dengan fungsi Parse karena sudah berjalan begitu lama. Saya hanya mencoba mencari tahu perbedaan rasional antara Char* dan UBYTE*. Mungkin saya salah hanya berpegang pada itu dan harus melihat beberapa aspek kode lainnya. :-( - person Aryan; 14.07.2010
comment
@Ayan, saya membayangkan sulit menemukan sesuatu dalam pengaturan seperti itu. Tetapi jika Anda ingin membersihkan kode itu, memulai dengan skema tipe yang lebih masuk akal adalah ide yang bagus. Jika dilihat banyak bug jahat hilang hanya dengan merapikan kode seperti itu. Semoga berhasil dalam hal apa pun. - person Jens Gustedt; 14.07.2010