මෙය ජනප්රිය ප්රශ්නයකි. ප්රශ්න කතුවරයා අසන දේ තේරුම් ගැනීම වැදගත් වන අතර එය වඩාත් පොදු අවශ්යතාවයට වඩා වෙනස් ය. අවශ්ය නොවන කේතය අනිසි ලෙස භාවිතා කිරීම අධෛර්යමත් කිරීම සඳහා, මම පසුව පිළිතුරු දුන්නෙමි.
පොදු අවශ්යතාවය
සෑම නූලකටම අක්ෂර කට්ටලයක් සහ කේතන ක්රමයක් ඇත. ඔබ System.String
වස්තුවක් අරාවකට පරිවර්තනය කරන විට System.Byte
තවමත් අක්ෂර කට්ටලයක් සහ කේතීකරණයක් ඇත. බොහෝ භාවිතයන් සඳහා, ඔබට අවශ්ය කුමන අක්ෂර කට්ටලය සහ කේතීකරණය ඔබ දන්නා අතර .NET "පරිවර්තනය සමඟ පිටපත් කිරීම" සරල කරයි. සුදුසු Encoding
පන්තිය තෝරන්න .
// using System.Text;
Encoding.UTF8.GetBytes(".NET String to byte array")
ඉලක්කගත අක්ෂර කට්ටලය හෝ කේතීකරණය ප්රභවයේ ඇති අක්ෂරයකට සහය නොදක්වන අවස්ථා හැසිරවීමට පරිවර්තනයට අවශ්ය විය හැකිය. ඔබට තේරීම් කිහිපයක් තිබේ: ව්යතිරේකය, ආදේශ කිරීම හෝ මඟ හැරීම. පෙරනිමි ප්රතිපත්තිය වන්නේ '?' ආදේශ කිරීමයි.
// using System.Text;
var text = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes("You win €100"));
// -> "You win ?100"
පැහැදිලිවම, පරිවර්තනයන් අනිවාර්යයෙන්ම පාඩු රහිත නොවේ!
සටහන: System.String
ප්රභව අක්ෂර කට්ටලය යුනිකෝඩ් වේ.
එකම අවුල් සහගත කාරණය නම් .NET එම අක්ෂර කට්ටලයේ එක් විශේෂිත කේතීකරණයේ නම සඳහා අක්ෂර කට්ටලයක නම භාවිතා කිරීමයි. Encoding.Unicode
කැඳවිය යුතුයි Encoding.UTF16
.
බොහෝ භාවිතයන් සඳහා එය එයයි. ඔබට අවශ්ය වන්නේ එය නම්, මෙහි කියවීම නවත්වන්න. කේතීකරණයක් යනු කුමක්දැයි ඔබට වැටහෙන්නේ නැත්නම් විනෝදජනක ජොයෙල් ස්පොල්ස්කි ලිපිය බලන්න .
විශේෂිත අවශ්යතාවය
දැන්, ප්රශ්න කතුවරයා අසයි, "සෑම නූලක්ම බයිට් සමූහයක් ලෙස ගබඩා කර ඇත, හරිද? මට එම බයිට් තිබිය නොහැක්කේ ඇයි?"
ඔහුට කිසිම පරිවර්තනයක් අවශ්ය නැත.
සිට C # පිරිවිතර :
C # හි අක්ෂර සහ නූල් සැකසුම් යුනිකෝඩ් කේතීකරණ භාවිතා කරයි. වර්ග වර්ගය UTF-16 කේත ඒකකයක් නියෝජනය කරන අතර නූල් වර්ගය UTF-16 කේත ඒකක අනුක්රමයක් නියෝජනය කරයි.
ඉතින්, අපි දන්නවා අපි ශුන්ය පරිවර්තනයක් ඉල්ලා සිටියහොත් (එනම්, UTF-16 සිට UTF-16 දක්වා), අපට අපේක්ෂිත ප්රති result ලය ලැබෙනු ඇත:
Encoding.Unicode.GetBytes(".NET String to byte array")
නමුත් කේතන ක්රම සඳහන් නොකිරීමට නම් අප එය වෙනත් ආකාරයකින් කළ යුතුය. අතරමැදි දත්ත වර්ගයක් පිළිගත හැකි නම්, මේ සඳහා සංකල්පීය කෙටිමඟක් ඇත:
".NET String to byte array".ToCharArray()
එමඟින් අපට අපේක්ෂිත දත්ත සමුදාය නොලැබෙන නමුත් මෙහර්දාඩ්ගේ පිළිතුරෙන් පෙන්නුම් කරන්නේ මෙම චාර් අරා බ්ලොක්කොපි භාවිතයෙන් බයිට් අරා බවට පරිවර්තනය කරන්නේ කෙසේද යන්නයි . කෙසේ වෙතත්, මෙය නූල දෙවරක් පිටපත් කරයි! තවද, එය පැහැදිලිවම කේතීකරණ-විශේෂිත කේත භාවිතා කරයි: දත්ත සමුදාය System.Char
.
නූල් ගබඩා කර ඇති සත්ය බයිට් වෙත ළඟා වීමට ඇති එකම ක්රමය වන්නේ දර්ශකයක් භාවිතා කිරීමයි. මෙම fixed
ප්රකාශය වටිනාකම් ලිපිනය ගනිමින් හැක. C # පිරිවිතරයෙන්:
[සඳහා] වර්ගයේ වචන ප්රකාශනයක් සඳහා, ... ආරම්භකය විසින් පළමු අක්ෂරයේ ලිපිනය ගණනය කරයි.
එසේ කිරීම සඳහා, සම්පාදකයා විසින් නූල් වස්තුවෙහි අනෙක් කොටස් සමඟ කේත මඟ හැරීම ලියයි RuntimeHelpers.OffsetToStringData
. එබැවින්, අමු බයිට් ලබා ගැනීම සඳහා, නූලට දර්ශකයක් සාදා අවශ්ය බයිට් ගණන පිටපත් කරන්න.
// using System.Runtime.InteropServices
unsafe byte[] GetRawBytes(String s)
{
if (s == null) return null;
var codeunitCount = s.Length;
/* We know that String is a sequence of UTF-16 codeunits
and such codeunits are 2 bytes */
var byteCount = codeunitCount * 2;
var bytes = new byte[byteCount];
fixed(void* pRaw = s)
{
Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount);
}
return bytes;
}
OdesCodesInChaos පෙන්වා දුන් පරිදි, ප්රති result ලය රඳා පවතින්නේ යන්ත්රයේ අවසානය මත ය. නමුත් ප්රශ්න කතුවරයා ඒ ගැන තැකීමක් නොකරයි.