チェンジセット 1688 (default)


以下の違いを無視:
日時:
2024/09/11 19:31:46 (4週前)
更新者:
hizuya@…
ログメッセージ:
  • 16進数を表す文字列をバイト配列に変換する機能を追加。
場所:
framework/trunk
ファイル:
4個の更新

凡例:

未変更
追加
削除
  • framework/trunk/CoreLibrary/Properties/Resources.designer.cs

    r1654 r1688  
    611611         
    612612        /// <summary> 
     613        ///   Improperly formatted hex string. に類似しているローカライズされた文字列を検索します。 
     614        /// </summary> 
     615        internal static string Argument_InvalidHexFormat { 
     616            get { 
     617                return ResourceManager.GetString("Argument_InvalidHexFormat", resourceCulture); 
     618            } 
     619        } 
     620         
     621        /// <summary> 
    613622        ///   Invalid key and value pair. に類似しているローカライズされた文字列を検索します。 
    614623        /// </summary> 
  • framework/trunk/CoreLibrary/Properties/Resources.resx

    r1654 r1688  
    205205    <value>Attempted to seek beyond range of stream.</value> 
    206206  </data> 
     207  <data name="Argument_InvalidHexFormat" xml:space="preserve"> 
     208    <value>Improperly formatted hex string.</value> 
     209  </data> 
    207210  <data name="Log_Data_CommonDbDebugging_CommandSourceKey" xml:space="preserve"> 
    208211    <value>Source</value> 
  • framework/trunk/CoreLibrary/Sources/Text/TextUtility.cs

    r1524 r1688  
    768768 
    769769            ConvertToHexStringImpl(bytes, index, count, toLowerCase, builder); 
     770        } 
     771 
     772        /// <summary> 
     773        /// 16進数を表す文字を <see cref="int"/> に変換して返します。 
     774        /// </summary> 
     775        /// <param name="hexChar">16進数を表す文字。</param> 
     776        /// <returns> 
     777        /// <paramref name="hexChar"/> を表す数値。 
     778        /// <paramref name="hexChar"/> が16進数を表す文字以外の場合は <c>-1</c>。 
     779        /// </returns> 
     780        public static int ConvertHexToInt32(char hexChar) 
     781        { 
     782            if (('0' <= hexChar) && (hexChar <= '9')) 
     783            { 
     784                return hexChar - '0'; 
     785            } 
     786 
     787            if (('a' <= hexChar) && (hexChar <= 'f')) 
     788            { 
     789                return (hexChar - 'a') + 10; 
     790            } 
     791 
     792            if (('A' <= hexChar) && (hexChar <= 'F')) 
     793            { 
     794                return (hexChar - 'A') + 10; 
     795            } 
     796 
     797            return -1; 
     798        } 
     799 
     800        /// <summary> 
     801        /// 16進数を表す文字列を <see cref="byte"/> の配列に変換して返します。 
     802        /// </summary> 
     803        /// <param name="data"> 
     804        /// 16進数を表す文字列。 
     805        /// 先頭に <c>0x</c> が付いている場合はその部分は無視されます。 
     806        /// </param> 
     807        /// <returns> 
     808        /// <paramref name="data"/> を元にした <see cref="byte"/> の配列。 
     809        /// </returns> 
     810        /// <exception cref="ArgumentNullException"> 
     811        /// <paramref name="data"/> が <see langword="null"/> 参照です。 
     812        /// </exception> 
     813        /// <exception cref="ArgumentException"> 
     814        /// <paramref name="data"/> が16進数を表す文字列として正しく有りません。 
     815        /// </exception> 
     816        public static byte[] ConvertHexToBinary(string data) 
     817        { 
     818            if (data == null) 
     819            { 
     820                throw new ArgumentNullException("data"); 
     821            } 
     822 
     823            int length = data.Length; 
     824            if (length % 2 != 0) 
     825            { 
     826                throw new ArgumentException(Resources.Argument_InvalidHexFormat); 
     827            } 
     828 
     829            int offset = length >= 2 && data[0] == '0' && data[1] == 'x' ? 2 : 0; 
     830 
     831            byte[] buffer = new byte[(length - offset) / 2]; 
     832            for (int i = 0; i < buffer.Length; i++) 
     833            { 
     834                int highValue = ConvertHexToInt32(data[(2 * i) + offset]); 
     835                int lowValue = ConvertHexToInt32(data[(2 * i) + offset + 1]); 
     836                if (highValue == -1 || lowValue == -1) 
     837                { 
     838                    throw new ArgumentException(Resources.Argument_InvalidHexFormat); 
     839                } 
     840 
     841                buffer[i] = (byte)((highValue << 4) | lowValue); 
     842            } 
     843 
     844            return buffer; 
    770845        } 
    771846 
  • framework/trunk/CoreTest/Sources/Text/TextUtilityTest.cs

    r1424 r1688  
    254254        { 
    255255            return TextUtility.GlobToRegex(glob).ToString(); 
     256        } 
     257 
     258        /// <summary> 
     259        /// <see cref="TextUtility.ConvertHexToInt32"/> をテストします。 
     260        /// </summary> 
     261        /// <param name="hexChar">16進数を表す文字。</param> 
     262        /// <returns> 
     263        /// <see cref="TextUtility.ConvertHexToInt32"/> の戻り値。 
     264        /// </returns> 
     265        [Test] 
     266        [TestCase(' ', ExpectedResult = -1)] 
     267        [TestCase('/', ExpectedResult = -1)] 
     268        [TestCase('0', ExpectedResult = 0x0)] 
     269        [TestCase('1', ExpectedResult = 0x1)] 
     270        [TestCase('2', ExpectedResult = 0x2)] 
     271        [TestCase('3', ExpectedResult = 0x3)] 
     272        [TestCase('4', ExpectedResult = 0x4)] 
     273        [TestCase('5', ExpectedResult = 0x5)] 
     274        [TestCase('6', ExpectedResult = 0x6)] 
     275        [TestCase('7', ExpectedResult = 0x7)] 
     276        [TestCase('8', ExpectedResult = 0x8)] 
     277        [TestCase('9', ExpectedResult = 0x9)] 
     278        [TestCase(':', ExpectedResult = -1)] 
     279        [TestCase('@', ExpectedResult = -1)] 
     280        [TestCase('A', ExpectedResult = 0xA)] 
     281        [TestCase('B', ExpectedResult = 0xB)] 
     282        [TestCase('C', ExpectedResult = 0xC)] 
     283        [TestCase('D', ExpectedResult = 0xD)] 
     284        [TestCase('E', ExpectedResult = 0xE)] 
     285        [TestCase('F', ExpectedResult = 0xF)] 
     286        [TestCase('G', ExpectedResult = -1)] 
     287        [TestCase('`', ExpectedResult = -1)] 
     288        [TestCase('a', ExpectedResult = 0xA)] 
     289        [TestCase('b', ExpectedResult = 0xB)] 
     290        [TestCase('c', ExpectedResult = 0xC)] 
     291        [TestCase('d', ExpectedResult = 0xD)] 
     292        [TestCase('e', ExpectedResult = 0xE)] 
     293        [TestCase('f', ExpectedResult = 0xF)] 
     294        [TestCase('g', ExpectedResult = -1)] 
     295        public int TestConvertHexToInt32(char hexChar) 
     296        { 
     297            return TextUtility.ConvertHexToInt32(hexChar); 
     298        } 
     299 
     300        /// <summary> 
     301        /// <see cref="TextUtility.ConvertHexToBinary"/> をテストします。 
     302        /// </summary> 
     303        /// <param name="data">16進数を表す文字列。</param> 
     304        [Test] 
     305        [TestCase("")] 
     306        [TestCase("00")] 
     307        [TestCase("FF")] 
     308        [TestCase("00ff00FF")] 
     309        [TestCase("0100FEff")] 
     310        [TestCase("0123456789ABcdEf")] 
     311        public void TestConvertHexToBinary(string data) 
     312        { 
     313            byte[] result = TextUtility.ConvertHexToBinary(data); 
     314            Assert.That(result, Is.Not.Null, "ConvertHexToBinary"); 
     315            string hex = TextUtility.ConvertToHexString(result, false); 
     316            Assert.That(hex, Is.EqualTo(data.ToUpperInvariant()), "HEX"); 
     317        } 
     318 
     319        /// <summary> 
     320        /// 先頭に <c>0x</c> の付いた16進数を表す文字列を元に 
     321        /// <see cref="TextUtility.ConvertHexToBinary"/> をテストします。 
     322        /// </summary> 
     323        /// <param name="data">16進数を表す文字列。</param> 
     324        [Test] 
     325        [TestCase("0x")] 
     326        [TestCase("0x00")] 
     327        [TestCase("0xFF")] 
     328        [TestCase("0x00ff00FF")] 
     329        [TestCase("0x0100FEff")] 
     330        [TestCase("0x0123456789ABcdEf")] 
     331        public void TestConvertHexToBinaryWithPrefix(string data) 
     332        { 
     333            byte[] result = TextUtility.ConvertHexToBinary(data); 
     334            Assert.That(result, Is.Not.Null, "ConvertHexToBinary"); 
     335            string hex = TextUtility.ConvertToHexString(result, false); 
     336            Assert.That(hex, Is.EqualTo(data.Substring(2).ToUpperInvariant()), "HEX"); 
     337        } 
     338 
     339        /// <summary> 
     340        /// 16進数を表す文字列として正しくない文字列を元に 
     341        /// <see cref="TextUtility.ConvertHexToBinary"/> をテストします。 
     342        /// </summary> 
     343        /// <param name="data">16進数を表す文字列。</param> 
     344        [Test] 
     345        [TestCase("0")] 
     346        [TestCase("012")] 
     347        [TestCase("G0")] 
     348        [TestCase("00GG00")] 
     349        public void TestConvertHexToBinaryWithError(string data) 
     350        { 
     351            Assert.That( 
     352                delegate 
     353                { 
     354                    TextUtility.ConvertHexToBinary(data); 
     355                }, 
     356                Throws.ArgumentException); 
    256357        } 
    257358 
詳しい使い方は TracChangeset を参照してください。