Saturday 1 July 2017

Big เล็ก ๆ น้อย ๆ Endian ไบนารี ตัวเลือก


ฉันพยายามที่จะปรับปรุงความเข้าใจของรูปแบบไฟล์ STFS โดยใช้โปรแกรมเพื่ออ่านข้อมูลทั้งหมดที่แตกต่างกันของข้อมูล การใช้เว็บไซต์ที่มีการอ้างอิงถึงการชดเชยใดมีข้อมูลอะไรฉันเขียนโค้ดที่มีตัวอ่านไบนารีไปที่ไฟล์และเก็บค่าในตัวแปรที่ถูกต้อง ปัญหาคือข้อมูลทั้งหมดจะถูก SUPPEDED เป็น Big Endian และทุกอย่างที่อ่านไบนารีอ่านคือ Little Endian ดังนั้น whats วิธีที่ดีที่สุดเพื่อไปเกี่ยวกับการแก้ไขนี้ฉันสามารถสร้างชั้นเลียนแบบของผู้อ่านไบนารีที่ส่งกลับอาร์เรย์ย้อนกลับของไบต์มีบางอย่างที่ฉันสามารถเปลี่ยนในชั้นเช่นที่จะทำให้อ่านใน endian ใหญ่ดังนั้นฉันไม่ต้องเขียนใหม่ ทุกสิ่งทุกอย่างช่วยได้ แก้ไข: ฉันพยายามเพิ่ม Encoding. BigEndianUnicode เป็นพารามิเตอร์ แต่ก็ยังอ่าน endian น้อย ในความเห็นของคุณคุณต้องระมัดระวังในการทำเช่นนี้ เหตุผลหนึ่งที่ต้องการแปลงจาก BigEndian ไป LittleEndian คือถ้าไบต์ถูกอ่านอยู่ใน BigEndian และระบบปฏิบัติการที่คำนวณจากพวกเขากำลังทำงานใน LittleEndian C ไม่ใช่ภาษาเดียวกับหน้าต่าง ด้วยพอร์ตเช่น Mono และแพลตฟอร์มอื่น ๆ ของ Microsoft เช่น Windows Phone 78 Xbox 360Xbox One Windwos CE Windows 8 Mobile Linux ด้วย MONO แอปเปิ้ลกับ MONO เป็นต้นแพลตฟอร์มปฏิบัติการอาจเป็นไปได้ใน BigEndian ซึ่ง กรณีที่คุณต้องการจะขันตัวเองหากคุณแปลงรหัสโดยไม่ต้องทำเช็คใด ๆ BitConverter มีฟิลด์อยู่แล้วเรียกว่า IsLittleEndian คุณสามารถใช้เพื่อพิจารณาว่าสภาพแวดล้อมการทำงานอยู่ใน LittleEndian หรือไม่ จากนั้นคุณสามารถดำเนินการย้อนกลับได้ตามเงื่อนไข เช่นฉันจริงเพียงแค่เขียนนามสกุลไบต์บางแทนการสร้างชั้นใหญ่: ลองจินตนาการรหัสตัวอย่างนี้ #: 26719 Stack Exchange, Inc เมื่อโอนจำนวนเต็มไบนารีในเครือข่ายเป็นสิ่งสำคัญเพื่อให้แน่ใจว่า ว่าระบบส่งและรับใช้รูปแบบเดียวกันหรือการแปลงเสร็จสิ้น ถ้าคอมพิวเตอร์ Big Endian ส่งเลขฐานสองดังกล่าวข้างต้นไปยังคอมพิวเตอร์ Little Endian โดยไม่มีการแปลงระบบจะตีความว่าเป็นหมายเลข 513 เพื่อหลีกเลี่ยงปัญหาในเครือข่ายที่ต่างกันจำนวนไบนารีจะถูกแปลงเป็นรูปแบบเครือข่ายมาตรฐาน (Big Endian) ก่อนส่ง ฟังก์ชั่น: htons โฮสต์ไปยังเครือข่าย htonl สั้นไปยังเครือข่าย Long สามารถใช้เพื่อแปลงข้อมูลไบนารีไปยังรูปแบบมาตรฐานของเครือข่าย บันทึกทางประวัติศาสตร์: ชื่อ Big Endian และ Endian Little มาจาก Swifts new Gullivers Travels ในเรื่องนี้ Lilliputians ถูกแบ่งออกเป็น Big Endians และ Endians เล็กน้อยตามที่ปลายไข่ต้มที่พวกเขาเชื่อว่าควรจะเปิดฉันได้พยายามค้นหารอบ ๆ แต่ยังไม่ได้สามารถหามากเกี่ยวกับตัวอักษรไบนารีและ endianness มีตัวอักษรไบนารีเล็ก ๆ น้อย ๆ endian, big-endian หรืออย่างอื่น (เช่นการจับคู่แพลตฟอร์มเป้าหมาย) ตัวอย่างเช่นค่าทศนิยมของ 0b0111 คืออะไร มันคือ 7 แพลตฟอร์มที่เฉพาะเจาะจงบางอย่างอื่นแก้ไข: ฉันเลือกค่าไม่ดีจาก 7 เนื่องจากเป็นตัวแทนภายในหนึ่งไบต์ คำถามนี้ได้รับการตอบรับอย่างเพียงพออย่างไรก็ตามข้อเท็จจริงนี้ บางพื้นหลัง: โดยทั่วไปฉันพยายามที่จะคิดออกว่าค่าของบิตอย่างน้อยอย่างมีนัยสำคัญและกำบังด้วยตัวอักษรไบนารีดูเหมือนจะเป็นวิธีที่ดีที่จะไป แต่ถ้ามีการรับประกันบางอย่างเกี่ยวกับ endianness ถาม 18 ธันวาคม 14 เวลา 16:21 ลูกบาศก์: แน่นอนตัวอักษรทศนิยมมี endianness นั่นคือเหตุผลว่าทำไม 7x3 ถึง 21 และไม่ใช่ 12 ลำดับใด ๆ ของตัวเลขโดยไม่คำนึงถึงฐานมี endianness เนื่องจากคำสั่งซื้อสามารถขึ้นหรือลงได้มีขนาดใหญ่และมี endian น้อยมาก endianness ไม่เคยสัมผัสโดยตรงในรหัสเว้นแต่คุณจะพยายามดึงออก (เช่นการใช้เทคนิคตัวชี้). Endianness 0b0111 เป็น 7 กฎเดียวกันกับ hex, เขียน does not หมายถึง 0x77AA ในแพลตฟอร์มบางเพราะที่จะไร้สาระ ที่จะ 0s พิเศษที่หายไปต่อไปพวกเขาจะได้รับการเบาะที่ด้านหน้าแล้วสิ่งทั้งพลิกหรือพวกเขาจะได้รับการเพิ่มหลังจากที่ฉันมีความคิดว่าไม่มีใครคาดหวังว่าถ้าเป็นกรณีที่ ประเด็นก็คือ C ไม่ได้ตั้งสมมติฐานเกี่ยวกับ endianness ของเครื่องถ้าคุณเขียนโค้ดโดยใช้ primitive และ literal ก็ให้พฤติกรรมจะเหมือนกันจากเครื่องไปยังเครื่อง (เว้นแต่คุณจะหลีกเลี่ยงระบบพิมพ์ซึ่งคุณอาจ ต้องทำ) เพื่อแก้ไขการปรับปรุงของคุณ: หมายเลขจะเป็นวิธีที่คุณเขียนออก บิตจะไม่ถูกจัดเรียงใหม่หรือสิ่งใด ๆ บิตที่สำคัญที่สุดจะอยู่ทางด้านซ้ายและบิตที่สำคัญที่สุดจะอยู่ทางด้านขวา ดูเหมือนจะมีความเข้าใจผิดเกี่ยวกับ endianness คืออะไร Endianness หมายถึงวิธีการไบต์ถูกสั่งให้อยู่ในหน่วยความจำและวิธีการที่จะต้องมีการตีความ ถ้าฉันให้หมายเลข 4172 และบอกว่านี่คือสี่พันหนึ่งร้อยเจ็ดสิบสองสิ่งที่ endianness คุณไม่สามารถจริงๆให้คำตอบเพราะคำถามไม่ได้ทำให้รู้สึก (หนึ่งอาจโต้แย้งว่าตัวเลขที่ใหญ่ที่สุดด้านซ้ายหมายถึง endian ใหญ่ แต่ Id ไม่เห็นด้วยกับสิ่งนี้ถูกต้อง) นี่เป็นเพียงตัวเลขไม่มีไบต์ที่จะตีความไม่มีที่อยู่ของหน่วยความจำ สมมติว่ามีการแทนจำนวนเต็ม 4 ไบต์ไบต์ที่ตรงกับมันคือ: ให้ได้รับหนึ่งในเหล่านั้นและบอกว่านี่คือการแสดงคอมพิวเตอร์ภายในของ 4172 คุณสามารถตรวจสอบว่า endian น้อยหรือใหญ่ของ ดังนั้นตอนนี้พิจารณาไบนารีของคุณ 0b0111 ตัวอักษรเหล่านี้ 4 บิตแทนหนึ่ง nybble และสามารถเก็บไว้เป็นอย่างใดอย่างหนึ่ง แต่คุณ dont ต้องดูแลเนื่องจากนี้ยังจัดการโดยฮาร์ดแวร์ภาษาสั่งการที่เรียบเรียงอ่านจากซ้ายไปขวาบิตที่สำคัญที่สุด อย่างน้อยอย่างมีนัยสำคัญ Endianness บิตไม่เกี่ยวกับแต่ละบิต ระบุว่า byte เป็น 8 บิตถ้าฉันมือคุณ 0b00000111 และกล่าว endian น้อยหรือใหญ่นี้อีกครั้งคุณลาดเทพูดเพราะคุณมีเพียงหนึ่งไบต์ Endianness ไม่จัดลำดับบิตใหม่ในไบต์หมายถึงการจัดเรียงใหม่ของไบต์ทั้งหมด (ยกเว้นกรณีที่คุณมีไบต์แบบหนึ่งไบต์) คุณไม่จำเป็นต้องดูแลเกี่ยวกับสิ่งที่คอมพิวเตอร์ของคุณใช้อยู่ภายใน 0b0111 ช่วยให้คุณประหยัดเวลาในการเขียนสิ่งต่างๆเช่นไม่ต้องแสดงความคิดเห็นอธิบายความสำคัญของตัวเลข ฉันต้องการจะชี้ให้เห็นว่าในระดับต่ำพอสมควรของการเขียนโปรแกรมที่คุณไม่สามารถหลีกเลี่ยง endianness เพราะข้อกำหนดของสิ่งที่คุณกำลังดำเนินการอาณัติปัจจัยการผลิตหรือผลของพวกเขาจะอยู่ใน endian littlebigwhatever ซึ่งรวมถึงโปรโตคอลเครือข่ายอัลกอริทึมการเข้ารหัสลับเป็นต้น เพียงเพราะคุณไม่ได้ทำสิ่งเหล่านี้ไม่ได้หมายความว่าพวกเขาไม่มีอยู่และ endianness จะรั่วไหลออกจากระบบสุขสบายชนิดที่ดีในสถานการณ์เหล่านี้ ดังนั้นส่วนที่ชาญฉลาดสำหรับส่วนของคุณเอง goodquot ดูเหมือนว่าไม่สมควร ndash Thomas Dec 19 14 at 2:37 RyanHaining การใช้ htons จากความคิดเห็นของคุณ: ใช้งานง่ายโดยไม่ต้องตั้งสมมติฐานเกี่ยวกับ endianness: uint16t htons (uint16t x) ทำให้สมมติฐานบางประการเกี่ยวกับการเป็นตัวแทนของ uint16t แต่ endianness ไม่ได้เป็นหนึ่งในสมมติฐานเหล่านั้นและอย่างน้อย clang optimizes นี้เป็นอย่างดี ฉันเห็นด้วยกับความคิดเห็นที่คนทั่วไปควรจะเขียนโค้ดที่ไม่ได้ทำสมมติฐานเกี่ยวกับ endianness ก็เป็นเพียงไม่จำเป็น ndash hvd Dec 19 14 at 8:55 literals จำนวนเต็มรวมทั้งไบนารีจะถูกตีความในลักษณะเดียวกับที่เราอ่านตามปกติตัวเลข (ตัวเลขซ้ายที่สุดมีความสำคัญมากที่สุด) มาตรฐาน C รับประกันการตีความวรรณกรรมแบบเดียวกันโดยไม่ต้องเกี่ยวข้องกับสภาพแวดล้อมเฉพาะที่คุณต้องการ ดังนั้นคุณไม่ต้องกังวลกับ endianness ในบริบทนี้ ตัวอย่างของ 0b0111 เท่ากับเจ็ดเสมอ มาตรฐาน C ไม่ใช้เงื่อนไขของ endianness ในการนับ literals จำนวน แต่ก็อธิบายได้ว่าตัวหนังสือมีการตีความที่สอดคล้องกันและการตีความหมายคือสิ่งที่คุณคาดหวัง C Standard - Integer Literals - 2.14.2 - paragraph 1 ตัวอักษรจำนวนเต็มคือลำดับของตัวเลขที่ไม่มีช่วงเวลาหรือส่วนเลขชัยจารย์โดยมีการแยกเครื่องหมายคำพูดเดี่ยว ๆ ออกซึ่งจะถูกละเว้นเมื่อกำหนดค่าของมัน จำนวนเต็มอักษรอาจมีคำนำหน้าที่ระบุฐานและส่วนต่อท้ายที่ระบุชนิดของมัน เลขแปดหลักแรกของลำดับของตัวเลขเป็นตัวเลขที่สำคัญที่สุด ไบนารีจำนวนเต็มอักษร (ฐานสอง) เริ่มต้นด้วย 0b หรือ 0B และประกอบด้วยลำดับของตัวเลขไบนารี ตัวเลขตามตัวอักษรฐานแปด (ฐานแปด) จะขึ้นต้นด้วยตัวเลข 0 และประกอบด้วยตัวเลขแปดหลัก จำนวนเต็มฐานสิบ (อักษรฐานสิบ) เริ่มต้นด้วยตัวเลขอื่นที่ไม่ใช่ 0 และประกอบด้วยลำดับของตัวเลขทศนิยม เลขฐานสิบหกเลขฐานสิบหก (ฐานสิบหก) ขึ้นต้นด้วย 0x หรือ 0X และประกอบด้วยลำดับของเลขฐานสิบหกซึ่งรวมถึงตัวเลขทศนิยมและตัวอักษรจาก a ถึง f ถึง A ถึง F ด้วยค่าทศนิยมสิบถึงสิบห้า ตัวอย่าง: เลขสิบสองสามารถเขียนได้ 12, 014, 0XC หรือ 0b1100 ตัวอักษร 1048576, 1048576, 0X100000, 0x100000 และ 0004000000 ทั้งหมดมีค่าเท่ากัน end example วิกิพีเดียอธิบายว่า endianness คืออะไรและใช้ระบบตัวเลขของเราเป็นตัวอย่างเพื่อทำความเข้าใจกับ big-endian เงื่อนไข endian และ endianness หมายถึงอนุสัญญาที่ใช้ในการแปลไบต์ที่สร้างขึ้นเป็นข้อมูลคำเมื่อไบต์เหล่านั้นเก็บอยู่ในหน่วยความจำคอมพิวเตอร์ ระบบ Big-endian จัดเก็บไบต์ที่สำคัญที่สุดของคำในที่อยู่ที่เล็กที่สุดและไบต์ที่สำคัญน้อยที่สุดจะถูกจัดเก็บไว้ในที่อยู่ที่ใหญ่ที่สุด (ดูได้จากบิตที่สำคัญที่สุด) ระบบ Little-endian ตรงกันข้ามจะเก็บไบต์ที่มีความสำคัญน้อยที่สุดในที่อยู่ที่เล็กที่สุด ตัวอย่างเกี่ยวกับ endianness คือการคิดเลขที่ทศนิยมที่ถูกเขียนและอ่านในสัญกรณ์ค่าตำแหน่ง สมมติว่าระบบเขียนที่เขียนตัวเลขจากซ้ายไปขวาตำแหน่งด้านซ้ายสุดจะเหมือนกับที่อยู่ที่เล็กที่สุดของหน่วยความจำที่ใช้และด้านขวาสุดจะใหญ่ที่สุด ตัวอย่างเช่นจำนวนหนึ่งร้อยยี่สิบสามเป็นลายลักษณ์อักษร 1 2 3 โดยมีสถานที่ที่เหลืออยู่นับร้อย ๆ แห่ง ใครก็ตามที่อ่านตัวเลขนี้ก็รู้ด้วยว่าตัวเลขด้านซ้ายสุดมีค่าสถานที่ที่ใหญ่ที่สุด นี่เป็นตัวอย่างของการประชุมใหญ่ ๆ ของชาวยุโรปในชีวิตประจำวัน ในบริบทนี้เรากำลังพิจารณาเลขจำนวนเต็มที่เป็นไบต์ของคำและคำที่เป็นตัวหนังสือ นอกจากนี้อักขระที่เหลืออยู่ในตัวอักษรจะถือว่ามีที่อยู่ที่เล็กที่สุด ด้วยอักษร 1234 ตัวเลขหนึ่งสองสามและสี่เป็นไบต์ของคำและ 1234 เป็นคำ มีตัวอักษรไบต์ 0b0111 ตัวเลขศูนย์หนึ่งหนึ่งและหนึ่งเป็นไบต์ของคำและคำว่า 0111 การพิจารณานี้ช่วยให้เราเข้าใจ endianness ในบริบทของภาษาซีและแสดงให้เห็นว่าตัวอักษรจำนวนเต็มมีลักษณะคล้ายกับ big-endian cmaster ที่อยู่ที่เล็กที่สุดก่อน แน่นอนว่าเรามักจะไม่ใช้คำว่า endianness สำหรับสตริงตัวเลขเลยและสำหรับเค้าโครงในหน่วยความจำเท่านั้น ดังนั้นหนึ่งสามารถพูดได้ว่าคำ quotendiannessquot ไม่ใช้กับ literals เลยหรือว่าพวกเขา bigendian เสมอ กล่าวว่า literals อยู่เสมอ endian น้อยผิดแน่นอน. ndash CodesInChaos Dec 18 14 at 17:22 Youre ขาดความแตกต่างระหว่าง endianness เป็นลายลักษณ์อักษรในรหัสที่มาและ endianness เป็นตัวแทนในรหัสวัตถุ คำตอบสำหรับแต่ละคนไม่แปลกใจ: ตัวอักษรรหัสต้นฉบับเป็น bigendian เพราะ thats วิธีการที่มนุษย์อ่านในรหัสวัตถุที่พวกเขากำลังเขียน แต่เป้าหมายอ่านพวกเขา เนื่องจากไบต์เป็นหน่วยความจำที่เล็กที่สุดที่เข้าถึงได้ฉันไม่เชื่อว่ามันจะเป็นไปได้ที่จะอ้างถึง endianness กับการแทนภายในใด ๆ ของบิตในไบต์ซึ่งเป็นวิธีเดียวที่จะค้นหา endianness สำหรับตัวเลขที่มีขนาดใหญ่ ) คือโดยการเข้าถึงพวกเขาจากการจัดเก็บชิ้นส่วนและไบต์ตามคำนิยามหน่วยเก็บข้อมูลที่เข้าถึงได้น้อยที่สุด ตอบเมื่อวันที่ 18 ธันวาคม 14 เวลา 17:58 Hurkyl ว่า คุณไม่สามารถบอกได้ว่าการลงทะเบียนเครื่องเป็น bigendian หรือไม่เพราะไม่มีการเปิดเผย - ไม่มีเหตุผลเลยที่จะเปิดเผย endianness ใด ๆ แต่เป็นการลงทะเบียน bigendianness เนื่องจากจุดรวมของ littlendian มีความเข้ากันได้กับบัสข้อมูล 8 บิตของโซดาฟางเพื่อจัดเก็บข้อมูลภายนอกหรือ อุปกรณ์ ndash jthill 18 ธันวาคม 18 เวลา 18:23 ภาษาซีซีไม่สนใจเกี่ยวกับ endianness ของจำนวนเต็มหลายไบต์ คอมไพเลอร์ CC ทำ คอมไพเลอร์แยกวิเคราะห์ซอร์สโค้ดและสร้างรหัสเครื่องสำหรับแพลตฟอร์มเป้าหมายที่เฉพาะเจาะจง คอมไพเลอร์โดยทั่วไปเก็บตัวอักษรจำนวนเต็มเช่นเดียวกับที่จัดเก็บจำนวนเต็มเช่นคำแนะนำของซีพียูเป้าหมายจะสนับสนุนการอ่านและเขียนข้อมูลในหน่วยความจำโดยตรง คอมไพเลอร์จะดูแลความแตกต่างระหว่างแพลตฟอร์มเป้าหมายดังนั้นคุณจึงไม่จำเป็นต้องทำ เวลาเท่านั้นที่คุณต้องกังวลเกี่ยวกับ endianness คือเมื่อคุณใช้ค่าไบนารีร่วมกับระบบอื่นที่มีลำดับไบต์แตกต่างจากนั้นคุณจะอ่านข้อมูลไบนารีในไบต์โดยไบต์และจัดเรียงไบต์ในหน่วยความจำตามลำดับที่ถูกต้องสำหรับ ระบบที่รหัสของคุณกำลังทำงานอยู่ ตอบ 18 ธ. ค. นี้เวลา 17:22 น. TheronWGenaux: ฮ่า ๆ ว่าต้องแก้ปัญหาได้ใช่โปรเซสเซอร์ x86 เริ่มต้นการจำลองการอ่านอย่างไม่เป็นทางการซึ่งทำงานได้ (แม้ว่าช้า) รหัสเดียวกันในโปรเซสเซอร์อื่นจะสร้างข้อผิดพลาดของบัส นี่เป็นเรื่องสนุกเมื่อคุณกำลังเขียนโค้ดและทดสอบบน x86 แล้วปรับใช้กับ CPU อื่น (เช่นฝัง) ndash psmears Dec 19 14 at 18:40 คุณอาจต้องการคิดเกี่ยวกับ C หรือ C หรือภาษาอื่น ๆ เป็น endian ภายในเล็กน้อย (คิดว่าตัวดำเนินการบิตwiseทำงาน) ถ้า HW ต้นแบบเป็น endian ขนาดใหญ่คอมไพเลอร์จะช่วยให้มั่นใจได้ว่าข้อมูลจะถูกเก็บไว้ใน endian ขนาดใหญ่ (เช่นสำหรับ endianness อื่น ๆ ) อย่างไรก็ตามการดำเนินการที่ชาญฉลาดของคุณจะทำงานเหมือนกับข้อมูล endian น้อย สิ่งที่ต้องจดจำก็คือถ้าเป็นภาษาที่เกี่ยวข้องข้อมูลก็ยังอยู่ในประเทศเล็ก ๆ ปัญหาเกี่ยวกับ Endianness เกิดขึ้นเมื่อคุณส่งข้อมูลจากประเภทหนึ่งไปยังอีก ตราบเท่าที่คุณไม่ทำแบบนั้นคุณก็ทำได้ดี ฉันถูกสอบสวนเกี่ยวกับคำสั่ง CC ภาษาเป็น endian ภายในเพียงเล็กน้อยเช่นฉันให้ตัวอย่างที่หลายคนรู้วิธีการทำงาน แต่ดีที่นี่ฉันไป เอาท์พุทบนระบบ endian เล็กน้อย: เอาท์พุทบนระบบ endian ใหญ่: ดังนั้นถ้าคุณไม่ทราบ endianness โปรเซสเซอร์ ที่ไม่ทุกอย่างออกมาทางขวาในระบบ endian น้อยดังนั้นผมจึงบอกว่าภาษาซีซีเป็น endian ภายในเพียงเล็กน้อย ตอบ 18 ธ. ค. 18 ที่ 18:17 ความคิดเห็นไม่ได้สำหรับการสนทนาแบบขยายการสนทนานี้ถูกย้ายไปที่แชท ndash bluefeet 9830 Dec 19 14 at 1:25 หนึ่งสามารถเขียนเช็คเดียวกันในภาษาประกอบหรือภาษาอื่นที่มีคำแนะนำ ดังนั้นรหัสนี้แสดงให้เห็นว่า quotlittle-endian มีลักษณะเป็นธรรมชาติมากกว่า big-endianquot ซึ่งไม่ได้ใช้เฉพาะกับ CC เท่านั้น นอกจากนี้ไม่มีอะไรจะทำเกี่ยวกับ literals ไบนารีในคำถาม ndash anatolyg ธ. ค. 21 14 เวลา 10:35 น

No comments:

Post a Comment