มีวิธีใดในการคัดลอก null bytes (ASCII 0x00) ไปยังคลิปบอร์ดบน Windows?


14

ไบต์ Null (ASCII 0x00) ดูเหมือนจะไม่สามารถคัดลอกได้ (Ctrl + C- ได้) บน Windows สำหรับการสาธิตนี้เปิดคอนโซล dev console.log('a\x00b')เบราว์เซอร์ของคุณและทำ หากคุณลองและคัดลอกสตริงผลลัพธ์บนเครื่อง Windows 8 (และอาจเป็น Windows รุ่นอื่นด้วย) คุณจะพบว่ามีเพียงการaคัดลอกเท่านั้น \x00และทุกอย่างหลังจากที่มันถูกละเว้น

มีวิธีการคัดลอกทั้งหมดของสตริงที่มีไบต์ว่างหรือไม่ คลิปบอร์ดสามารถเก็บไบต์ที่ว่างได้หรือไม่?

(คำถามเสริม: เหตุใดจึงไม่สามารถคัดลอก null ไบต์ได้ตัวอย่างเช่นมีเหตุผลเกี่ยวกับความปลอดภัยหรือเป็นเพียง Windows ที่โง่เง่า?)


คำถามที่ดี .. น่าสนใจที่จะดูว่ามันใส่ลงในคลิปบอร์ด xxd สามารถ nulls เอาท์พุท C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
barlop

ใช้ unxutils gclip และ pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- มันไม่ชัดเจนสำหรับฉันว่าโมฆะกำลังจะเข้าสู่คลิปบอร์ด .. หรือว่าพวกมันอยู่ใน แต่ไม่ออกมา
barlop

2
ที่ใดที่หนึ่งในห่วงโซ่โปรแกรมกำลังใช้ฟังก์ชัน / การแทนค่าสตริงที่สิ้นสุดด้วย null (เช่นฟังก์ชันสตริง C) พบบ่อยมาก ความเข้าใจที่น้อยของฉันเกี่ยวกับสิ่งต่าง ๆ คือ "ใช่" มีปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นกับการฝังค่า Null ซึ่งส่วนใหญ่เกิดจากความเป็นไปได้ที่จะระบุความยาวของสตริงและบัฟเฟอร์ล้นอย่างผิดพลาด
Yorik

มันเป็นปริศนา: ฉันคัดลอกเนื้อหาของ JPG ไปยังคลิปบอร์ดและเมื่อฉันอ่านกลับมันจะถูกตัดทอนที่ null แรกซึ่งแสดงว่าคลิปบอร์ดนั้นเป็นข้อความ แต่ฉันสามารถคัดกรองหรือตัดและวางภาพระหว่างแพ็คเกจกราฟิกได้โดยไม่มีปัญหา
AFH

ฉันเดาว่ามันขึ้นอยู่กับรูปแบบที่ใช้ คลิปบอร์ดสนับสนุนรูปแบบต่าง ๆ หากคุณคัดลอกข้อความตัวอักษรส่วนใหญ่จะไม่ได้รับการสนับสนุนเนื่องจากใช้เป็นตัวยุติสตริง หากคุณใช้รูปแบบคลิปบอร์ดไบนารีคุณสามารถคัดลอกและวางไบต์ว่างได้
Alexey Ivanov

คำตอบ:


10

ไม่คุณไม่สามารถใส่ข้อความที่มีอักขระ null ฝังอยู่ในคลิปบอร์ดได้ ดู Let 's ที่รายการมาตรฐานรูปแบบคลิปบอร์ดของ Windows มีบางรูปแบบที่เก็บสิ่งต่าง ๆ ที่เข้าใจกันโดยทั่วไปเป็นข้อความ

  • CF_TEXT (1)
  • CF_OEMTEXT (7)
  • CF_UNICODETEXT (13)

ทุกคนมีประโยคนี้ในคำนิยาม:

อักขระ null ส่งสัญญาณจุดสิ้นสุดของข้อมูล

ตอนนี้CF_UNICODETEXT เก็บข้อมูลไว้ในรูปแบบ UTF-16LEดังนั้นจึงมีแนวโน้มที่จะมีไบต์ว่าง แต่อักขระ null (ไบต์ว่างสองอันในแถวโดยทั่วไป) จะยังคงสิ้นสุดสตริง

เราสามารถคาดเดาได้ว่าเหตุใดอักขระที่เป็นโมฆะจึงไม่ได้รับอนุญาตในข้อความของคลิปบอร์ด แต่น่าจะเป็นเพราะฟังก์ชั่นการประมวลผลสตริงที่ใช้บ่อยที่สุดใน Windows ถือว่าเป็นสัญญาณที่สิ้นสุด วิธีอื่นที่จะทราบว่าหยุดสตริงจะนำหน้าด้วยความยาวของมัน

คุณสามารถเก็บกราฟิกไว้บนคลิปบอร์ดแม้ว่าพวกเขาจะมีไบต์ว่างเพราะพวกมันผ่านไปในรูปแบบคลิปบอร์ดที่แตกต่างกัน (เช่นCF_BITMAP) ซึ่งจะต้องเข้าใจแตกต่างกันไปตามโปรแกรม


ขอบคุณ - คำตอบที่ดี ฉันได้เรียนรู้บางสิ่งที่ดีเกี่ยวกับคลิปบอร์ดของ Windows
senshin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.