Tuesday 1 August 2017

Php แปลง สตริง ลงใน ไบนารี ตัวเลือก


สตริงเป็นเพียงลำดับไบต์ดังนั้นข้อมูลไบนารีจริงใน PHP คุณกำลังพยายามทำอะไรถ้าคุณต้องการเก็บข้อมูลไบนารีไว้ในฐานข้อมูลของคุณปัญหาส่วนใหญ่มักเป็นความหมายของคอลัมน์ในฐานข้อมูลของคุณ PHP ไม่แตกต่างระหว่างข้อมูลไบนารีและสตริง แต่ฐานข้อมูลทำ ใน MySQL เช่นคุณควรเก็บข้อมูลไบนารีไว้ใน BINARY คอลัมน์ VARBINARY หรือ BLOB อีกทางเลือกหนึ่งคือการ base64encode สตริง PHP ของคุณและเก็บไว้ในคอลัมน์ VARCHAR หรือ TEXT บางส่วนในฐานข้อมูล แต่โปรดทราบว่าความยาวของสตริงจะเพิ่มขึ้นเมื่อใช้ base64encode แฮชของคุณมีอยู่แล้วและพร้อมสำหรับใช้กับฐานข้อมูลของคุณ อย่างไรก็ตามคุณต้องแปลงเป็นรูปแบบที่กำหนดไว้ในคอลัมน์ฐานข้อมูล สตริงใน PHP (จนถึง 5.3) เป็นสตริงไบนารี นั่นหมายความว่ามีข้อมูลไบนารีเท่านั้น อย่างไรก็ตามเนื่องจากความเข้ากันได้ย้อนหลังกับ PHP 6 คุณสามารถส่งสตริงของคุณอย่างชัดเจนเป็นไบนารี: แต่นั่นเป็นเพียงเหตุผลความเข้ากันได้ในโค้ดของคุณคุณก็สามารถทำได้: เพราะมันเหมือนกัน แปลงเป็นฟุ่มเฟือย มั่นใจได้ว่ามันทำงานได้อย่างสมบูรณ์แบบ อาจเป็นเพียงปัญหาเกี่ยวกับความเข้าใจในสิ่งที่คำสั่งเหล่านี้ทำและสิ่งที่เข้ารหัสสตริงในฐานข้อมูลจริงคือการค้นหาที่คุณแนะนำให้คุณไม่ต้องการใช้การเข้ารหัสไบต์ btw ซึ่งปกติใช้สำหรับการเข้ารหัสฐานข้อมูลไม่สนับสนุนดีแล้วคุณไม่ควรใช้ ใช้ฐานข้อมูลเพื่อค้นหา แค่พูด. ndash hakre 7 พฤษภาคม 16 at 18:17 ฉันมั่นเหมาะจะแนะนำให้ใช้ในตัวห้องสมุดรหัสผ่านมาตรฐานที่มาพร้อมกับ PHP - นี่เป็นตัวอย่างที่ดีในการใช้งานได้ สำหรับผู้ที่มาที่นี่เพื่อหาวิธีไปจาก Binary Strings ไปเป็น Decimals และกลับมีตัวอย่างที่ดีด้านล่าง สำหรับการแปลงสตริงไบนารีเป็น decimalschars คุณสามารถทำสิ่งต่างๆเช่นนี้ได้ ผลลัพธ์ด้านบน: สำหรับการแปลงทศนิยมให้เป็น charstrings คุณสามารถทำได้ดังนี้ผลลัพธ์ด้านบน: ตอบ 11 มิ.ย. 15 เวลา 14:11 Strings in PHP มักเป็น BLOB ดังนั้นคุณจึงสามารถใช้สตริงเพื่อเก็บค่าสำหรับ BLOB ของฐานข้อมูลของคุณได้ ทั้งหมดนี้เป็นฐานการแปลงและอื่น ๆ จะทำอย่างไรกับการนำเสนอ BLOB ถ้าคุณต้องการให้การแสดงภาพ BLOB ที่มนุษย์สามารถอ่านได้ดีแล้วจะทำให้รู้สึกถึงการแสดงไบต์ที่มีอยู่และอาจใช้ hex มากกว่า decimal ดังนั้นสตริง 41 42 43 เป็นวิธีที่ดีที่จะนำเสนออาร์เรย์ไบต์ที่อยู่ใน C แต่จะเห็นได้ชัดว่าไม่ใช่วิธีที่ดีในการแสดงไบต์เหล่านี้สตริง ABC เป็นตัวแทนที่มีประสิทธิภาพเพราะในความเป็นจริง BLOB เดียวกัน ( เฉพาะในกรณีนี้ไม่ใหญ่เท่าไร) ในทางปฏิบัติคุณมักจะได้รับ BLOB ของคุณจากฟังก์ชันที่ส่งกลับสตริง - เช่นฟังก์ชันแฮชที่หรือฟังก์ชันอื่น ๆ ที่มีอยู่แล้วเช่น fread ในกรณีที่หายาก (แต่ไม่ค่อยหายากเมื่อลองทำอะไรเลย) ที่คุณต้องสร้างสตริงจากไบต์ที่เข้ารหัสยากฉันไม่รู้ว่ามีประสิทธิภาพมากกว่าการแปลงสตริง hex กับสิ่งที่เรียกว่าสตริงไบนารีใน PHP: ถ้าคุณ vardump (ข้อมูล) itll แสดงสตริง (3) ABC Thats เนื่องจาก 0x41 65 ทศนิยม A (ในการเข้ารหัสโดยทั่วไป) เนื่องจากการดูข้อมูลไบนารีโดยการตีความว่าเป็นสตริงจึงไม่ง่ายนักคุณอาจต้องการสร้าง wrapper พื้นฐานเพื่อทำให้การแก้จุดบกพร่องง่ายขึ้น กระดาษห่อหุ้มที่เป็นไปได้อย่างหนึ่งคือนี่คือสิ่งที่ฉันปรุงขึ้นทันทีและอาจเป็นเพียงจุดเริ่มต้นสำหรับกระดาษห่อของคุณเอง แต่แนวคิดก็คือการใช้สตริงสำหรับการจัดเก็บเนื่องจากเป็นโครงสร้างที่มีประสิทธิภาพมากที่สุดใน PHP พร้อมกับให้วิธีการเช่น toArray () สำหรับใช้ในการดีบักการตรวจสอบเวลาในการตรวจสอบเนื้อหา แน่นอนคุณสามารถใช้อาร์เรย์ PHP ที่ตรงไปตรงมาอย่างสมบูรณ์แบบและแพ็คเป็นสตริงเมื่อเชื่อมต่อกับบางสิ่งบางอย่างที่ใช้สตริงสำหรับข้อมูลไบนารี ขึ้นอยู่กับระดับที่คุณเป็นจริงจะปรับเปลี่ยนหยดนี้อาจพิสูจน์ได้ง่ายขึ้นและแม้ว่าจะไม่ได้เป็นพื้นที่ที่มีประสิทธิภาพฉันคิดว่า youd ได้รับการยอมรับในหลายงาน ตัวอย่างเพื่ออธิบายฟังก์ชันการทำงาน: ฟังก์ชันที่รวดเร็วในการแปลงสตริงไบนารีเป็นฟังก์ชันลำดับบิต BinString2BitSequence (mystring) mybitseq end strlen (mystring) for (i i i i i) mybyte decbin (ord (mystring i)) แปลง char สตริง mybitseq สตริง substr (00000000 0. 8 - strlen (mybyte)) mybyte 8 บิตที่บรรจุกลับ mybitseq echo BinString2BitSequence (ABCDEF) OUTPUT010000010100001001000011010001000100010101000110 เกี่ยวกับศูนย์ท้ายหลังจากทดสอบตัวเลือกทั้งหมดที่กล่าวถึงที่นี่โดยคนอื่น ๆ ฉันได้ทำการทดสอบของฉันเองเกี่ยวกับประสิทธิภาพนี่คือผลลัพธ์: timestart microtime (true) for (i 0 i lt 1000 i) bin printf (08b. decimal) timeend microtime (true) เวลาหมดเวลา - timestart echo lthrgtDuracion time segundosltbrgtn echo bin. ltbrgt timestart microtime (true) for (i 0 i lt 1000 i) bin sprintf (08d. decbin (decimal)) timeend เวลาจริง (timetime) เวลาที่แท้จริง - time timet time (เวลาจริง) time time - timestart echo lthrgtDuracion time segundosltbrgtn echo bin ltbrgt timestart microtime (true) for (i 0 i lt 1000 i) ถัง decbin (ทศนิยม) bin substr (00000000 0. 8 - strlen (ถัง)) bin timeend microtime (true) ไทม์เวลา - timestart echo lthrgtDuracion time segundosltbrgtn echo bin. ltbrgt 0000100100001001000010010000100. (Duracion 0.0134768486023 segundos 8 Duracion 0.00054407119751 segundos 00001001 Duracion 0.000833988189697 segundos 00001001 ดังนั้นผู้ชนะคือ ltphp bin sprintf (08d. decbin (ทศนิยม)) gt ห้องสมุด GNU MP (phpmanualenbook. gmp. php) ให้ วิธีการได้อย่างมีประสิทธิภาพในการแปลงสตริงไบนารีของความยาวใด ๆ ไปเป็นตัวแทนของพวกเขาไบนารี (เช่น decbin เทียบเท่ากับสตริง) str randombytes (1024) สตริงไบนารีผลตัวอย่าง gmpstrval (gmpimport (str), 2) ดูคู่มือสำหรับตัวเลือกต่างๆเช่น endianness zeroPadded sprintf (0. (strlen (str) 8) s. result) pad ศูนย์หากจำเป็นเช่น กับ strpad หรือ sprintf ตามที่แสดง strAgain gmpexport (gmpinit (result.)) การดำเนินการแบบย้อนกลับคล้ายคลึงกับ bindec Decimal to Binary conversion โดยใช้ส่วนขยาย BCMath ฟังก์ชัน BCDec2Bin (อินพุต) เอาท์พุทถ้า (pregmatch (d อินพุต)) ในขณะที่เอาต์พุต (Input 0) chr (48 (อินพุต 2)) อินพุท BCDiv (อินพุท 2) เอาต์พุตขาออกเอาต์พุต (เอาท์พุท) (เอาท์พุทเอาท์พุท) 0) นี่จะแปลงจาก Base-10 เป็น Base-2 โดยใช้ BCMath (การคำนวณความแม่นยำโดยพลการ) ดูเพิ่มเติม: ฟังก์ชัน BCBin2Dec ของฉันในเอกสาร bindec เพลิดเพลินกับไนโตรเจน hi folks ฉันต่อสู้สำหรับวันที่จะได้รับเลขทศนิยมใหญ่แปลงเป็นไบนารีบนแพลตฟอร์ม Windows สุดท้ายด้วยฟังก์ชัน bcmath นี่คือสิ่งที่ได้ผลสำหรับฉัน ได้มันทำงานกับฟังก์ชัน bcmath, ทำงานสำหรับ 64 บิตในเครื่อง Windows 32 บิตเสร็จแล้ว base2 binnr ถ้า (pregmatch (0-9, สตริง)) สำหรับ (i0 stringchr (i) i) decnri อื่น decnrstring ขณะ (decnrgtbase) while (bccomp (decnr, base) 1) ถ้า ((decnr-base) gt0) ถ้า (bccomp (bcsub (decnr, base) 0) 1) decnrdecnr-base decnrbcsub (decnr, base) binnr.1 basebase2 basebcdiv (ฐาน 2) elseif ((decnr-base) lt0) elseif (bccomp (bcsub (decnr ฐาน) 0) -1) binnr.0 basebase2 basebcdiv (ฐาน 2) elseif ((decnr-base) 0) elseif (bccomp (bcsub ( decnr ฐาน) 0) 0) binnr.1 เสร็จแล้ว 1 while (basegt1) ในขณะที่ (bccomp (base, 1) 1) binnr.0 basebase2 basebcdiv (base, 2) ที่นี่คุณสามารถแปลง 64bit แทน 32bit ด้วย decbin มาตรฐาน lt (decbin (rest), decent (dec) () () () () () () () () () () () ส่วนที่เหลือ ) echo ltpregt for (i1.52147483647.0-10ilt1.52147483647.010i) echo ธันวาคม:.i. bindecValues ​​(decimal. reverse false. false false) 1. ฟังก์ชันนี้ใช้เลขทศนิยมแปลงเป็นไบนารีและส่งกลับค่าทศนิยมของแต่ละไบนารี (binary) ค่าไบนารีแต่ละตัว (a 1) ในสตริงไบนารี คุณสามารถใช้ค่าทศนิยมที่ใหญ่กว่าได้หากคุณส่งต่อไปยังฟังก์ชันเป็นสตริง 2. พารามิเตอร์ที่สองกำหนดให้กลับออก 3. พารามิเตอร์ตัวที่สามผกผันสตริงไบนารีเช่น 101 กลายเป็น 010 - darkshad3 ที่ yahoo dot com bin decbin (เลขฐานสิบ) ถ้า (ผกผัน) bin strreplace (0. x. bin) strreplace ถัง (1. 0. bin) (ถัง 0) bin2 strpad (ถังรวม - i. 0) arraypush (สต็อค bindec (bin2)) ย้อนกลับ (bin. rsort (หุ้น): sort (stock) return impode (,.stock) gt ผลที่พิมพ์ออกมาคือ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 ฉันคิดว่านี่เป็นฟังก์ชันที่ดีที่สุด เกือบไม่มีที่สิ้นสุด (จนถึง 250 หรือบางอย่าง) ในขณะที่ (i gt 0) if (int - pow (2 i) lt 0) binair 0. binair else binair 1. binair int int (2 i) getal Get get ระวัง พยายามทดสอบไบนารีที่ชาญฉลาดด้วยจำนวนเต็ม: คำสั่ง FFFFFFFF: php - r print (decbin (4294967295).n) ผล: 11111111111111111111111111111111 คำสั่ง C3E9CAC8: php - r print (decbin (3286878920).n) ผล: 11000011111010011100101011001000 ไม่ว่าจะระบุ (int) ใช้คำสั่ง: php - r print ((int) (3286878920 amp 4294967295).n) ผลลัพธ์: -1008088376 (int) ขณะนี้ผลที่คาดว่าจะเกิดขึ้น (คาดเดาผลกระทบต่อประสิทธิภาพ): php - r print (bindec (decbin ((3286878920 amp 4294967295))) n) result: 3286878920 (float) note เพิ่มเติม: ถ้าคุณ bitwise และบิตสุ่มบางตัวที่มีลำดับ 1 บิตมีความยาวเท่ากันผลลัพธ์ที่คาดหวังคือลำดับบิตสุ่มเดียวกัน ไม่เปลี่ยนแปลง ถ้าคุณต้องการเก็บข้อมูลนี้ไว้ในโลกจำนวนเต็มเพื่อการเปรียบเทียบที่เร็วกว่าคุณอาจเสี่ยงต่อผลลัพธ์ของคุณสำหรับข้อ จำกัด ของจำนวนเต็มที่ลงนาม ค่าสูงสุดที่คุณสามารถใช้สำหรับผลลัพธ์ที่ต้องการคือ (7FFFFFFF หรือจำนวนเต็ม 2147483647) ซึ่งเป็นจำนวนครึ่งหนึ่งของจำนวนเต็มสูงสุดที่ไม่ได้ระบุจำนวนสูงสุด 32 บิต (ขึ้นกับแพลตฟอร์ม) ค่าการแปลงสตริงเป็นไบนารีโพสต์โพสต์โดย hmscott จะทำงานบน multi - สตริงอักขระ ขออภัยฉันคิดว่าฉันน่าจะเข้าใจได้มากกว่านี้ Im สกัดข้อมูลจากตารางแหล่งที่มาใน Oracle ไปยังตาราง SQL Server Oracle ถูกตั้งค่าเป็น Case-Sensitive ขณะที่ SQL ถูกตั้งค่าเป็นแบบไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ เพื่อเติมข้อมูลตารางและรักษา PK ที่ถูกต้อง (จาก Oracle) ฉันต้องแปลงคอลัมน์จากสตริงเป็นไบนารี (ฉันเก็บสำเนาของสตริงเดิมในคอลัมน์ที่แยกต่างหาก) ดังนั้นฉันต้องมี 50145J ในไบนารีและ 50145j ในรูปแบบไบนารีเป็นค่าที่ต่างกัน ฉันคิดว่า ASCII (char) จะทำงานเฉพาะกับตัวอักษรเดียว ฉันผิด ASCII ใช้งานได้กับตัวอักษรเพียงครั้งละครั้ง แต่ไม่มีอะไรที่จะป้องกันไม่ให้คุณเรียกใช้ ASCII ภายในลูปเพื่อผนวกผลลัพธ์ที่ส่งกลับมาด้วย คุณจำเป็นต้องแยกสิ่งที่มักจะแสดงเพื่อให้มนุษย์สามารถอ่านได้โดยมีค่าจัดเก็บข้อมูลภายในที่แท้จริง ตอนนี้คุณทำสิ่งที่ไม่ชัดเจน (อย่างน้อยกับฉัน) quotBinaryQuot ไม่ได้คำนวณในกรณีนี้เพื่อดูความเป็นจริงของฉัน quotBinary numberquot คือ STRING (อักขระประเภทข้อมูล) ของ ONES amp ZEROES อย่างใดฉันไม่คิดว่านี่คือสิ่งที่คุณต้องการสร้างเพื่อสร้าง โปรดจำไว้ว่าเมื่อสตริงอักขระ "quot50145Jqu" เป็นจริงจริงๆแล้วแปลงเป็น BINARY จะกลายเป็น STRING ที่มีความยาว 48 อักขระคำถามเชิงวาทศิลป์ถ้าทั้ง 50145J และ 50145j เป็นคีย์หลักภายในตาราง Oracle VARCHAR2 ประเภทข้อมูลหนึ่งสิ่งที่จะเป็นประเภทข้อมูล ของ PK ใน SQL Server และวิธีการทั้งสองค่าจะแตกต่างกัน I dont ทราบว่ามีหน้าที่ Oracle ทำเช่นนี้อาจจะช่วยแทนได้ ฟังก์ชันนี้จะส่งกลับเป็นสตริง ASCII (ค่อนข้างสั้นกว่าการแทนไบนารี) สร้างหรือแทนที่ฟังก์ชัน toascii (inSource IN VARCHAR2) AS ResultString varchar2 (381) - ความยาวที่เป็นไปได้ของแหล่งที่มา 3 สำหรับ i in 1. length (inSource) loop ผลลัพท์: ResultString trim (tochar (ascii (substr (inSource i. 1 )) end end return ผลลัพธ์การสิ้นสุด (endString end) ผลลัพธ์ของผลลัพธ์ท้ายที่สุดแล้วคุณจะใส่ลงในแพ็กเกจและเพิ่ม RESTRICTREFERENCES เพื่อช่วยให้ประสิทธิภาพของออราเคิลดีขึ้น เลือก toascii (ชื่อคอลัมน์) จากตารางโปรดอย่าส่งอีเมลถึงฉันโดยตรงกับคำถาม ฉันอาจจะเพิ่งกลับบ้านจากผับและไม่สามารถรับประกันความมีเหตุผลของคำตอบของฉันได้ ในความเป็นจริงฉันไม่สามารถเชื่อว่าฉันจริงทำมันที่บ้าน

No comments:

Post a Comment