チェンジセット 1688 (default)
- 日時:
- 2024/09/11 19:31:46 (4週前)
- 場所:
- framework/trunk
- ファイル:
-
- 4個の更新
凡例:
- 未変更
- 追加
- 削除
-
framework/trunk/CoreLibrary/Properties/Resources.designer.cs
r1654 r1688 611 611 612 612 /// <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> 613 622 /// Invalid key and value pair. に類似しているローカライズされた文字列を検索します。 614 623 /// </summary> -
framework/trunk/CoreLibrary/Properties/Resources.resx
r1654 r1688 205 205 <value>Attempted to seek beyond range of stream.</value> 206 206 </data> 207 <data name="Argument_InvalidHexFormat" xml:space="preserve"> 208 <value>Improperly formatted hex string.</value> 209 </data> 207 210 <data name="Log_Data_CommonDbDebugging_CommandSourceKey" xml:space="preserve"> 208 211 <value>Source</value> -
framework/trunk/CoreLibrary/Sources/Text/TextUtility.cs
r1524 r1688 768 768 769 769 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; 770 845 } 771 846 -
framework/trunk/CoreTest/Sources/Text/TextUtilityTest.cs
r1424 r1688 254 254 { 255 255 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); 256 357 } 257 358
※ 詳しい使い方は
TracChangeset を参照してください。