第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何正確比較字符串和字節(jié)?

如何正確比較字符串和字節(jié)?

PHP
料青山看我應(yīng)如是 2024-01-20 16:04:40
我正在嘗試將一些文件讀取為字節(jié)并將其與“\u0019\u0093\r\n\u001a\n”進(jìn)行比較。我確信我總會(huì)得到 byte[]{ 0x19, 0x93, 0x0d, 0x0a, 0x1a, 0x0a }。我嘗試將這些字節(jié)轉(zhuǎn)換為字符串并與字符串進(jìn)行比較,但總是錯(cuò)誤。所以我嘗試將字符串轉(zhuǎn)換為字節(jié)。但當(dāng)我比較它們時(shí)也總是錯(cuò)誤的。(在 Windows 10 上使用 .NET Core 3.0)我嘗試像下面的代碼byte[] bytes = new byte[]{ 0x19, 0x93, 0x0d, 0x0a, 0x1a, 0x0a };string s = "\u0019\u0093\r\n\u001a\n";System.Console.WriteLine(Encoding.Default.GetString(bytes) == s);System.Console.WriteLine(s.Length);foreach (var b in Encoding.Default.GetBytes(s)){    System.Console.WriteLine("Byte: "+b);}System.Console.WriteLine(Encoding.Default.GetString(bytes) == s);輸出是:False6Byte: 25Byte: 194Byte: 147Byte: 13Byte: 10Byte: 26Byte: 10False比較總是返回 false。我發(fā)現(xiàn)從字符串轉(zhuǎn)換為字節(jié)后,我又多了一個(gè)字節(jié),并且不知道 194 來(lái)自哪里。為什么會(huì)出現(xiàn)這種情況?我想轉(zhuǎn)換后它們應(yīng)該是相等的。這是錯(cuò)的嗎?如果我想得到我所期望的,我該怎么辦?
查看完整描述

1 回答

?
喵喔喔

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊

在原始編碼字節(jié)中,有問(wèn)題的字符代碼是0x0093。


您遇到的問(wèn)題是,在Default系統(tǒng)上的編碼中(在 Windows 上將是系統(tǒng)當(dāng)前的代碼頁(yè)),編碼的字符0x0093無(wú)法識(shí)別。因此,當(dāng)您嘗試對(duì)其進(jìn)行解碼時(shí),您將獲得 UTF16 字符點(diǎn)0xfffd(這是 .NET 解碼器針對(duì)無(wú)法識(shí)別的字符的默認(rèn)值)。然后將其編碼回默認(rèn)編碼0x93c2(您在輸出中看到的字節(jié)序列,以十進(jìn)制表示,194后跟147)。


無(wú)論如何,此行為與默認(rèn)編碼設(shè)置為 UTF8 一致,可能表明它是 Linux 系統(tǒng)(大多數(shù) Windows 系統(tǒng)將使用某些特定于區(qū)域設(shè)置的代碼頁(yè)作為默認(rèn)編碼,而不是 UTF8)。


如果您希望將原始字節(jié)0x93轉(zhuǎn)換為具有基本相同值(即0x0093,又名'\u0093')的 UTF16 字符,那么您需要使用文本編碼來(lái)解碼原始字節(jié),其中代碼點(diǎn)0x93實(shí)際上轉(zhuǎn)換為 UTF16 代碼點(diǎn)0x0093。


幸運(yùn)的是,有一個(gè)網(wǎng)站實(shí)際上會(huì)告訴我們哪些編碼包含該字符,以及它們的值是什么:https ://www.compart.com/en/unicode/charsets/containing/U+0093


從該表中,我們可以看到大量的編碼都是這種情況(還有一些編碼將 UTF16 字符'\u0093'編碼為不同的值,即0x33……顯然,我們不想要其中任何一個(gè))。列表中的第一個(gè)編碼 - “ISO-8859-1” - 看起來(lái)合適,所以讓我們嘗試使用它來(lái)解碼你的字節(jié):


byte[] bytes = new byte[] { 0x19, 0x93, 0x0d, 0x0a, 0x1a, 0x0a };

string s = "\u0019\u0093\r\n\u001a\n";

Encoding encoding = Encoding.GetEncoding("iso-8859-1");

System.Console.WriteLine(encoding.GetString(bytes) == s);

System.Console.WriteLine(s.Length);

foreach (var b in encoding.GetBytes(s))

{

    System.Console.WriteLine("Byte: " + b);

}

System.Console.WriteLine(encoding.GetString(bytes) == s);

這輸出正是你想要的:


True

6

Byte: 25

Byte: 147

Byte: 13

Byte: 10

Byte: 26

Byte: 10

True

顯示的字節(jié)甚至是bytes數(shù)組中的確切字節(jié),我們可以通過(guò)將此行添加到程序末尾來(lái)演示:


System.Console.WriteLine(encoding.GetBytes(s).SequenceEqual(bytes));

這也將打印True.


這個(gè)故事的寓意是:了解您嘗試解碼的字節(jié)的原始編碼不是可選的。您必須確切地知道使用了哪種編碼,因?yàn)樗褪牵阂环N編碼。如果您使用了錯(cuò)誤的編碼,您可能還想嘗試解碼加密的數(shù)據(jù)。


根據(jù)定義,不同的文本編碼是不同的。這意味著一種編碼中的字節(jié)含義與其他編碼中的字節(jié)含義完全不同(某種程度上……大多數(shù)編碼在最低 128 個(gè)代碼點(diǎn)中重疊,因?yàn)樗鼈兌蓟?ASCII)。如果您使用錯(cuò)誤的編碼來(lái)解碼某些字節(jié),您只會(huì)得到隨機(jī)結(jié)果(或者,在這種情況下,解碼器將根本無(wú)法識(shí)別該字符并將其轉(zhuǎn)換為表示無(wú)法識(shí)別的字符的占位符)。


查看完整回答
反對(duì) 回復(fù) 2024-01-20
  • 1 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)