{"id":20974930,"url":"https://github.com/usausa/smart-net-bytemapper","last_synced_at":"2025-10-30T10:20:40.785Z","repository":{"id":50546273,"uuid":"59538107","full_name":"usausa/Smart-Net-ByteMapper","owner":"usausa","description":"Byte array object mapper library.","archived":false,"fork":false,"pushed_at":"2025-08-17T02:17:00.000Z","size":2928,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-19T17:32:12.596Z","etag":null,"topics":["io","mapper","mapping","objectmapper"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/usausa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-05-24T03:39:11.000Z","updated_at":"2025-08-17T02:17:04.000Z","dependencies_parsed_at":"2023-12-23T11:52:11.131Z","dependency_job_id":"08ac4647-7386-4e40-87ab-22333202f9b0","html_url":"https://github.com/usausa/Smart-Net-ByteMapper","commit_stats":{"total_commits":530,"total_committers":1,"mean_commits":530.0,"dds":0.0,"last_synced_commit":"da869a14b6b712bbdaa2b86330f790f3179bd03a"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/usausa/Smart-Net-ByteMapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usausa%2FSmart-Net-ByteMapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usausa%2FSmart-Net-ByteMapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usausa%2FSmart-Net-ByteMapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usausa%2FSmart-Net-ByteMapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/usausa","download_url":"https://codeload.github.com/usausa/Smart-Net-ByteMapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usausa%2FSmart-Net-ByteMapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281787907,"owners_count":26561635,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-30T02:00:06.501Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["io","mapper","mapping","objectmapper"],"created_at":"2024-11-19T04:35:25.805Z","updated_at":"2025-10-30T10:20:40.777Z","avatar_url":"https://github.com/usausa.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Smart.IO.ByteMapper .NET - byte array mapper library for .NET\r\n\r\n[![NuGet](https://img.shields.io/nuget/v/Usa.Smart.IO.ByteMapper.svg)](https://www.nuget.org/packages/Usa.Smart.IO.ByteMapper)\r\n\r\n## What is this ?\r\n\r\n* byte array \u003c-\u003e object mapper.\r\n* Configuration by attribute and expressions support.\r\n* Converter can be specified for each property.\r\n* Can change default setting for factory and type.\r\n* Supports different profiles for the same type.\r\n* ASP.NET Core integration.\r\n* Fast custom converter options exist.\r\n\r\n### Usage example\r\n\r\n```csharp\r\n// Data class\r\npublic sealed class ComplexData\r\n{\r\n    public string StringValue1 { get; set; }\r\n    public string StringValue2 { get; set; }\r\n    public string StringValue3 { get; set; }\r\n    public int IntValue1 { get; set; }\r\n    public int IntValue2 { get; set; }\r\n    public int? IntValue3 { get; set; }\r\n    public int? IntValue4 { get; set; }\r\n    public decimal DecimalValue1 { get; set; }\r\n    public decimal? DecimalValue2 { get; set; }\r\n    public bool BoolValue1 { get; set; }\r\n    public bool? BoolValue2 { get; set; }\r\n    public DateTime DateTimeValue1 { get; set; }\r\n    public DateTime? DateTimeValue2 { get; set; }\r\n}\r\n```\r\n\r\n```csharp\r\n// Configration by expression\r\nvar mapperFactory = new MapperFactoryConfig()\r\n    .UseOptionsDefault()\r\n    .DefaultEncoding(Encoding.GetEncoding(932))\r\n    .CreateMapByExpression\u003cComplexData\u003e(144, config =\u003e config\r\n        .ForMember(x =\u003e x.StringValue1, m =\u003e m.Text(20))\r\n        .ForMember(x =\u003e x.StringValue2, m =\u003e m.Text(20))\r\n        .ForMember(x =\u003e x.StringValue3, m =\u003e m.Text(20))\r\n        .ForMember(x =\u003e x.IntValue1, m =\u003e m.Integer(8))\r\n        .ForMember(x =\u003e x.IntValue2, m =\u003e m.Integer(8))\r\n        .ForMember(x =\u003e x.IntValue3, m =\u003e m.Integer(8))\r\n        .ForMember(x =\u003e x.IntValue4, m =\u003e m.Integer(8))\r\n        .ForMember(x =\u003e x.DecimalValue1, m =\u003e m.Decimal(10, 2))\r\n        .ForMember(x =\u003e x.DecimalValue2, m =\u003e m.Decimal(10, 2))\r\n        .ForMember(x =\u003e x.BoolValue1, m =\u003e m.Boolean())\r\n        .ForMember(x =\u003e x.BoolValue2, m =\u003e m.Boolean())\r\n        .ForMember(x =\u003e x.DateTimeValue1, m =\u003e m.DateTime(\"yyyyMMddHHmmss\"))\r\n        .ForMember(x =\u003e x.DateTimeValue2, m =\u003e m.DateTime(\"yyyyMMddHHmmss\")))\r\n    .ToMapperFactory();\r\n\r\n// Create type mapper\r\nvar mapper = mapperFactory.Create\u003cComplexData\u003e();\r\n```\r\n\r\n```csharp\r\n// Usage\r\nvar buffer = new byte[mapper.Size];\r\nvar data = new ComplexData\r\n{\r\n    StringValue1 = \"XXXXXXXXXXXXXXXXXXXX\",\r\n    StringValue2 = \"あああああ\",\r\n    StringValue3 = string.Empty,\r\n    IntValue1 = 1,\r\n    IntValue2 = 0,\r\n    IntValue3 = 1,\r\n    IntValue4 = null,\r\n    BoolValue1 = true,\r\n    BoolValue2 = null,\r\n    DecimalValue1 = 1.23m,\r\n    DecimalValue2 = null,\r\n    DateTimeValue1 = new DateTime(2000, 12, 31, 23, 59, 59, 999),\r\n    DateTimeValue2 = null\r\n};\r\n\r\n// object to byte array\r\nmapper.ToByte(buffer, 0, data);\r\n// buffer\r\n// [XXXXXXXXXXXXXXXXXXXXあああああ                                     1       0       1              1.23          1 20001231235959              \\r\\n]\r\n\r\n// byte array to object\r\nmapper.FromByte(buffer, 0, data);\r\n\r\n```\r\n\r\nPerformance in this case.\r\n\r\n* 1,700,000 op/s byte array to object\r\n* 1,150,000 op/s object to byte array\r\n\r\n## NuGet\r\n\r\n| Package | Note |\r\n|-|-|\r\n| [![NuGet](https://img.shields.io/nuget/v/Usa.Smart.IO.ByteMapper.svg)](https://www.nuget.org/packages/Usa.Smart.IO.ByteMapper/) | Core libyrary |\r\n| [![NuGet](https://img.shields.io/nuget/v/Usa.Smart.IO.ByteMapper.Options.svg)](https://www.nuget.org/packages/Usa.Smart.IO.ByteMapper.Options/) | Optional converters |\r\n| [![NuGet](https://img.shields.io/nuget/v/Usa.Smart.IO.ByteMapper.AspNetCore.svg)](https://www.nuget.org/packages/Usa.Smart.IO.ByteMapper.AspNetCore/) | ASP.NET Core integration |\r\n\r\n## Benchmark\r\n\r\n``` ini\r\nBenchmarkDotNet=v0.13.1, OS=Windows 10.0.22000\r\nAMD Ryzen 9 5900X, 1 CPU, 24 logical and 12 physical cores\r\n.NET SDK=6.0.100\r\n  [Host]    : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT\r\n  MediumRun : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT\r\n\r\nJob=MediumRun  IterationCount=15  LaunchCount=2  \r\nWarmupCount=10  \r\n```\r\n\r\n|                       Method |       Mean |     Error |    StdDev |     Median |        Min |        Max |        P90 |  Gen 0 | Allocated |\r\n|----------------------------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----------:|-------:|----------:|\r\n|                ReadIntBinary |   3.345 ns | 0.0774 ns | 0.1159 ns |   3.316 ns |   3.230 ns |   3.572 ns |   3.551 ns | 0.0014 |      24 B |\r\n|                  ReadBoolean |   5.022 ns | 0.0328 ns | 0.0481 ns |   5.033 ns |   4.947 ns |   5.098 ns |   5.085 ns | 0.0014 |      24 B |\r\n|                  ReadBytes10 |   5.874 ns | 0.0190 ns | 0.0266 ns |   5.874 ns |   5.812 ns |   5.925 ns |   5.904 ns | 0.0024 |      40 B |\r\n|                  ReadBytes20 |   5.930 ns | 0.0975 ns | 0.1367 ns |   5.857 ns |   5.781 ns |   6.232 ns |   6.067 ns | 0.0029 |      48 B |\r\n|       ReadSjisText20Single20 |  52.194 ns | 2.2086 ns | 3.1675 ns |  52.198 ns |  48.863 ns |  55.666 ns |  55.373 ns | 0.0038 |      64 B |\r\n|          ReadSjisText20Wide5 |  32.381 ns | 0.5825 ns | 0.8718 ns |  32.353 ns |  31.328 ns |  33.406 ns |  33.350 ns | 0.0019 |      32 B |\r\n|          ReadSjisText20Empty |  16.353 ns | 0.0348 ns | 0.0521 ns |  16.340 ns |  16.273 ns |  16.476 ns |  16.427 ns |      - |         - |\r\n|     ReadNumberTextShort4Zero |  22.510 ns | 0.1019 ns | 0.1461 ns |  22.481 ns |  22.275 ns |  22.772 ns |  22.695 ns | 0.0029 |      48 B |\r\n|      ReadNumberTextShort4Max |  22.668 ns | 0.3600 ns | 0.5388 ns |  22.439 ns |  22.250 ns |  24.294 ns |  23.354 ns | 0.0033 |      56 B |\r\n|       ReadNumberTextInt8Zero |  23.409 ns | 0.2145 ns | 0.3144 ns |  23.223 ns |  22.936 ns |  23.848 ns |  23.785 ns | 0.0029 |      48 B |\r\n|        ReadNumberTextInt8Max |  25.040 ns | 0.0904 ns | 0.1326 ns |  25.066 ns |  24.827 ns |  25.254 ns |  25.190 ns | 0.0038 |      64 B |\r\n|     ReadNumberTextLong18Zero |  27.307 ns | 0.8070 ns | 1.1829 ns |  26.299 ns |  26.039 ns |  29.010 ns |  28.698 ns | 0.0029 |      48 B |\r\n|      ReadNumberTextLong18Max |  32.598 ns | 0.4815 ns | 0.7207 ns |  32.372 ns |  31.771 ns |  34.288 ns |  33.701 ns | 0.0052 |      88 B |\r\n|   ReadNumberTextDecimal8Zero |  41.387 ns | 0.1724 ns | 0.2417 ns |  41.314 ns |  41.043 ns |  41.974 ns |  41.689 ns | 0.0038 |      64 B |\r\n|    ReadNumberTextDecimal8Max |  53.479 ns | 0.1082 ns | 0.1517 ns |  53.491 ns |  53.180 ns |  53.742 ns |  53.663 ns | 0.0043 |      72 B |\r\n|  ReadNumberTextDecimal18Zero |  48.544 ns | 0.2512 ns | 0.3438 ns |  48.488 ns |  47.528 ns |  49.079 ns |  48.949 ns | 0.0038 |      64 B |\r\n|   ReadNumberTextDecimal18Max |  77.345 ns | 0.2930 ns | 0.4385 ns |  77.304 ns |  76.483 ns |  78.244 ns |  77.797 ns | 0.0057 |      96 B |\r\n|  ReadNumberTextDecimal28Zero |  55.038 ns | 1.2192 ns | 1.6688 ns |  55.033 ns |  53.032 ns |  56.810 ns |  56.744 ns | 0.0038 |      64 B |\r\n|   ReadNumberTextDecimal28Max | 104.013 ns | 0.4448 ns | 0.6658 ns | 103.908 ns | 103.065 ns | 105.241 ns | 105.076 ns | 0.0066 |     112 B |\r\n|            ReadDateTimeText8 |  98.251 ns | 0.2435 ns | 0.3644 ns |  98.174 ns |  97.712 ns |  99.111 ns |  98.737 ns | 0.0038 |      64 B |\r\n|           ReadDateTimeText14 | 140.822 ns | 1.1505 ns | 1.7221 ns | 140.893 ns | 138.492 ns | 143.298 ns | 142.794 ns | 0.0046 |      80 B |\r\n|           ReadDateTimeText17 | 161.067 ns | 3.1529 ns | 4.5217 ns | 161.275 ns | 155.872 ns | 166.506 ns | 165.891 ns | 0.0046 |      80 B |\r\n|               ReadText13Code |  14.578 ns | 0.0250 ns | 0.0367 ns |  14.577 ns |  14.524 ns |  14.646 ns |  14.626 ns | 0.0029 |      48 B |\r\n|              ReadAscii13Code |  10.305 ns | 0.2965 ns | 0.4346 ns |  10.635 ns |   9.792 ns |  10.872 ns |  10.780 ns | 0.0029 |      48 B |\r\n|             ReadText30Wide15 |  30.066 ns | 0.0541 ns | 0.0792 ns |  30.062 ns |  29.949 ns |  30.206 ns |  30.173 ns | 0.0033 |      56 B |\r\n|          ReadUnicode30Wide15 |   8.543 ns | 0.4213 ns | 0.6042 ns |   8.905 ns |   7.877 ns |   9.344 ns |   9.172 ns | 0.0033 |      56 B |\r\n|        ReadIntegerShort4Zero |   5.962 ns | 0.0647 ns | 0.0969 ns |   5.943 ns |   5.829 ns |   6.225 ns |   6.063 ns | 0.0014 |      24 B |\r\n|         ReadIntegerShort4Max |   5.540 ns | 0.0522 ns | 0.0782 ns |   5.509 ns |   5.457 ns |   5.690 ns |   5.672 ns | 0.0014 |      24 B |\r\n|             ReadInteger8Zero |   6.964 ns | 0.0525 ns | 0.0736 ns |   6.946 ns |   6.866 ns |   7.066 ns |   7.055 ns | 0.0014 |      24 B |\r\n|              ReadInteger8Max |   7.221 ns | 0.0165 ns | 0.0232 ns |   7.221 ns |   7.185 ns |   7.284 ns |   7.246 ns | 0.0014 |      24 B |\r\n|               ReadLong18Zero |  10.934 ns | 0.9761 ns | 1.4610 ns |  11.047 ns |   9.148 ns |  12.452 ns |  12.412 ns | 0.0014 |      24 B |\r\n|                ReadLong18Max |  12.429 ns | 0.5720 ns | 0.8385 ns |  12.467 ns |  11.590 ns |  13.591 ns |  13.562 ns | 0.0014 |      24 B |\r\n|             ReadDecimal8Zero |  13.540 ns | 0.0273 ns | 0.0401 ns |  13.539 ns |  13.455 ns |  13.626 ns |  13.599 ns | 0.0019 |      32 B |\r\n|              ReadDecimal8Max |  15.916 ns | 0.2583 ns | 0.3786 ns |  15.776 ns |  15.613 ns |  16.761 ns |  16.709 ns | 0.0019 |      32 B |\r\n|            ReadDecimal18Zero |  15.285 ns | 0.0502 ns | 0.0736 ns |  15.287 ns |  15.147 ns |  15.422 ns |  15.377 ns | 0.0019 |      32 B |\r\n|             ReadDecimal18Max |  24.128 ns | 0.1211 ns | 0.1737 ns |  24.162 ns |  23.854 ns |  24.401 ns |  24.366 ns | 0.0019 |      32 B |\r\n|            ReadDecimal28Zero |  18.241 ns | 0.0428 ns | 0.0627 ns |  18.249 ns |  18.096 ns |  18.366 ns |  18.311 ns | 0.0019 |      32 B |\r\n|             ReadDecimal28Max |  45.839 ns | 0.1844 ns | 0.2759 ns |  45.871 ns |  45.398 ns |  46.284 ns |  46.199 ns | 0.0019 |      32 B |\r\n|                ReadDateTime8 |  15.217 ns | 0.0831 ns | 0.1218 ns |  15.156 ns |  15.050 ns |  15.420 ns |  15.401 ns | 0.0014 |      24 B |\r\n|               ReadDateTime14 |  22.269 ns | 0.0972 ns | 0.1394 ns |  22.255 ns |  22.033 ns |  22.502 ns |  22.435 ns | 0.0014 |      24 B |\r\n|               ReadDateTime17 |  30.346 ns | 4.4469 ns | 6.2339 ns |  24.572 ns |  24.269 ns |  36.855 ns |  36.761 ns | 0.0014 |      24 B |\r\n\r\n|                       Method |       Mean |     Error |    StdDev |     Median |        Min |        Max |        P90 |  Gen 0 | Allocated |\r\n|----------------------------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----------:|-------:|----------:|\r\n|               WriteIntBinary |   3.655 ns | 0.0756 ns | 0.1085 ns |   3.572 ns |   3.539 ns |   3.788 ns |   3.778 ns | 0.0014 |      24 B |\r\n|                 WriteBoolean |   3.574 ns | 0.0213 ns | 0.0312 ns |   3.570 ns |   3.521 ns |   3.651 ns |   3.619 ns | 0.0014 |      24 B |\r\n|                 WriteBytes10 |   5.724 ns | 0.0081 ns | 0.0122 ns |   5.722 ns |   5.704 ns |   5.750 ns |   5.741 ns |      - |         - |\r\n|                 WriteBytes20 |   5.530 ns | 0.0092 ns | 0.0128 ns |   5.530 ns |   5.508 ns |   5.570 ns |   5.541 ns |      - |         - |\r\n|      WriteSjisText20Single20 |  78.005 ns | 0.1827 ns | 0.2678 ns |  78.046 ns |  77.575 ns |  78.468 ns |  78.314 ns | 0.0028 |      48 B |\r\n|         WriteSjisText20Wide5 |  34.718 ns | 0.0794 ns | 0.1164 ns |  34.723 ns |  34.472 ns |  35.016 ns |  34.850 ns | 0.0024 |      40 B |\r\n|         WriteSjisText20Empty |  27.137 ns | 0.0821 ns | 0.1177 ns |  27.099 ns |  26.996 ns |  27.483 ns |  27.283 ns | 0.0033 |      56 B |\r\n|    WriteNumberTextShort4Zero |  19.482 ns | 0.0531 ns | 0.0779 ns |  19.487 ns |  19.310 ns |  19.637 ns |  19.575 ns | 0.0033 |      56 B |\r\n|     WriteNumberTextShort4Max |  24.889 ns | 0.1000 ns | 0.1402 ns |  24.890 ns |  24.636 ns |  25.074 ns |  25.047 ns | 0.0052 |      88 B |\r\n|      WriteNumberTextInt8Zero |  20.650 ns | 0.0463 ns | 0.0649 ns |  20.648 ns |  20.539 ns |  20.802 ns |  20.741 ns | 0.0033 |      56 B |\r\n|       WriteNumberTextInt8Max |  27.394 ns | 0.0648 ns | 0.0970 ns |  27.395 ns |  27.137 ns |  27.539 ns |  27.528 ns | 0.0057 |      96 B |\r\n|    WriteNumberTextLong18Zero |  24.486 ns | 0.0733 ns | 0.1051 ns |  24.499 ns |  24.296 ns |  24.687 ns |  24.598 ns | 0.0033 |      56 B |\r\n|     WriteNumberTextLong18Max |  40.001 ns | 0.1535 ns | 0.2298 ns |  39.962 ns |  39.614 ns |  40.531 ns |  40.260 ns | 0.0081 |     136 B |\r\n|  WriteNumberTextDecimal8Zero |  43.059 ns | 0.1351 ns | 0.1937 ns |  43.050 ns |  42.661 ns |  43.400 ns |  43.345 ns | 0.0052 |      88 B |\r\n|   WriteNumberTextDecimal8Max |  62.609 ns | 0.2993 ns | 0.4388 ns |  62.672 ns |  61.817 ns |  63.215 ns |  63.157 ns | 0.0066 |     112 B |\r\n| WriteNumberTextDecimal18Zero |  45.796 ns | 0.1153 ns | 0.1690 ns |  45.808 ns |  45.393 ns |  46.100 ns |  45.989 ns | 0.0052 |      88 B |\r\n|  WriteNumberTextDecimal18Max |  91.072 ns | 1.8825 ns | 2.8177 ns |  91.233 ns |  87.864 ns |  94.347 ns |  94.058 ns | 0.0085 |     144 B |\r\n| WriteNumberTextDecimal28Zero |  49.022 ns | 0.1017 ns | 0.1426 ns |  49.018 ns |  48.593 ns |  49.263 ns |  49.180 ns | 0.0052 |      88 B |\r\n|  WriteNumberTextDecimal28Max | 126.365 ns | 0.5301 ns | 0.7602 ns | 126.623 ns | 124.858 ns | 127.465 ns | 127.173 ns | 0.0100 |     168 B |\r\n|           WriteDateTimeText8 |  85.799 ns | 0.6347 ns | 0.9304 ns |  85.524 ns |  84.353 ns |  87.199 ns |  86.820 ns | 0.0057 |      96 B |\r\n|          WriteDateTimeText14 | 120.636 ns | 0.6155 ns | 0.9212 ns | 120.716 ns | 119.015 ns | 122.145 ns | 121.706 ns | 0.0071 |     120 B |\r\n|          WriteDateTimeText17 | 210.494 ns | 0.5407 ns | 0.7754 ns | 210.300 ns | 209.300 ns | 212.644 ns | 211.284 ns | 0.0076 |     128 B |\r\n|              WriteText13Code |  16.510 ns | 0.0571 ns | 0.0837 ns |  16.500 ns |  16.350 ns |  16.698 ns |  16.625 ns | 0.0024 |      40 B |\r\n|             WriteAscii13Code |  11.706 ns | 0.0357 ns | 0.0524 ns |  11.706 ns |  11.630 ns |  11.819 ns |  11.768 ns | 0.0024 |      40 B |\r\n|            WriteText30Wide15 |  26.997 ns | 0.0664 ns | 0.0952 ns |  26.991 ns |  26.841 ns |  27.233 ns |  27.104 ns | 0.0033 |      56 B |\r\n|         WriteUnicode30Wide15 |   4.468 ns | 0.0094 ns | 0.0122 ns |   4.466 ns |   4.451 ns |   4.489 ns |   4.485 ns |      - |         - |\r\n|       WriteIntegerShort4Zero |   8.110 ns | 0.2074 ns | 0.3040 ns |   7.865 ns |   7.784 ns |   8.469 ns |   8.431 ns | 0.0014 |      24 B |\r\n|        WriteIntegerShort4Max |  10.172 ns | 0.1290 ns | 0.1891 ns |  10.274 ns |   9.931 ns |  10.420 ns |  10.390 ns | 0.0014 |      24 B |\r\n|            WriteInteger8Zero |   9.564 ns | 0.1997 ns | 0.2864 ns |   9.549 ns |   9.209 ns |   9.929 ns |   9.874 ns | 0.0014 |      24 B |\r\n|             WriteInteger8Max |  13.802 ns | 0.0361 ns | 0.0530 ns |  13.804 ns |  13.710 ns |  13.888 ns |  13.869 ns | 0.0014 |      24 B |\r\n|              WriteLong18Zero |  11.346 ns | 0.0647 ns | 0.0907 ns |  11.390 ns |  11.192 ns |  11.470 ns |  11.439 ns | 0.0014 |      24 B |\r\n|               WriteLong18Max |  24.592 ns | 0.0493 ns | 0.0722 ns |  24.597 ns |  24.423 ns |  24.758 ns |  24.668 ns | 0.0014 |      24 B |\r\n|            WriteDecimal8Zero |  17.599 ns | 0.0534 ns | 0.0799 ns |  17.584 ns |  17.446 ns |  17.816 ns |  17.680 ns | 0.0043 |      72 B |\r\n|             WriteDecimal8Max |  37.087 ns | 0.5286 ns | 0.7748 ns |  37.531 ns |  36.052 ns |  38.028 ns |  37.967 ns | 0.0043 |      72 B |\r\n|           WriteDecimal18Zero |  19.800 ns | 0.0576 ns | 0.0844 ns |  19.809 ns |  19.653 ns |  19.950 ns |  19.904 ns | 0.0043 |      72 B |\r\n|            WriteDecimal18Max |  55.634 ns | 0.0986 ns | 0.1446 ns |  55.635 ns |  55.279 ns |  55.912 ns |  55.788 ns | 0.0043 |      72 B |\r\n|           WriteDecimal28Zero |  22.239 ns | 0.1084 ns | 0.1484 ns |  22.247 ns |  21.996 ns |  22.479 ns |  22.434 ns | 0.0043 |      72 B |\r\n|            WriteDecimal28Max |  77.243 ns | 0.3443 ns | 0.5047 ns |  77.411 ns |  76.368 ns |  78.150 ns |  77.866 ns | 0.0043 |      72 B |\r\n|               WriteDateTime8 |  18.810 ns | 0.0582 ns | 0.0853 ns |  18.811 ns |  18.660 ns |  18.963 ns |  18.906 ns | 0.0014 |      24 B |\r\n|              WriteDateTime14 |  27.737 ns | 0.2297 ns | 0.3294 ns |  27.760 ns |  27.296 ns |  28.201 ns |  28.090 ns | 0.0014 |      24 B |\r\n|              WriteDateTime17 |  31.469 ns | 0.0764 ns | 0.1096 ns |  31.472 ns |  31.280 ns |  31.674 ns |  31.600 ns | 0.0014 |      24 B |\r\n\r\n## Map by Attribute\r\n\r\n```csharp\r\n[Map(32, NullFiller = (byte)'_')]\r\n[TypeEncoding(932)]\r\n[TypeTrueValue((byte)'Y')]\r\n[TypeFalseValue((byte)'N')]\r\npublic sealed class Data\r\n{\r\n    [MapInteger(0, 8)]\r\n    public int IntValue { get; set; }\r\n\r\n    [MapDecimal(8, 10, 2, GroupingSize = 3)]\r\n    public int DecimalValue { get; set; }\r\n\r\n    [MapText(18, 10)]\r\n    public string StringValue { get; set; }\r\n\r\n    [MapBoolean(28)]\r\n    public bool BoolValue1 { get; set; }\r\n\r\n    [MapBoolean(29, NullValue = (byte)'-')]\r\n    public bool? BoolValue2 { get; set; }\r\n}\r\n```\r\n\r\n```csharp\r\nvar mapperFactory = new MapperFactoryConfig()\r\n    .CreateMapByAttribute\u003cData\u003e()\r\n    .ToMapperFactory();\r\n```\r\n\r\n## Map by Expression\r\n\r\n```csharp\r\npublic sealed class Data\r\n{\r\n    public int IntValue { get; set; }\r\n\r\n    public int DecimalValue { get; set; }\r\n\r\n    public string StringValue { get; set; }\r\n\r\n    public bool BoolValue1 { get; set; }\r\n\r\n    public bool? BoolValue2 { get; set; }\r\n}\r\n```\r\n\r\n```csharp\r\nvar mapperFactory = new MapperFactoryConfig()\r\n    .CreateMapByExpression\u003cData\u003e(32, config =\u003e config\r\n        .NullFiller((byte)'_')\r\n        .TypeEncoding(Encoding.GetEncoding(932))\r\n        .TypeTrueValue((byte)'Y')\r\n        .TypeFalseValue((byte)'N')\r\n        .ForMember(x =\u003e x.IntValue, m =\u003e m.Integer(8))\r\n        .ForMember(x =\u003e x.DecimalValue, m =\u003e m.Decimal(10, 2).GroupingSize(3))\r\n        .ForMember(x =\u003e x.StringValue, m =\u003e m.Text(10))\r\n        .ForMember(x =\u003e x.BoolValue1, m =\u003e m.Boolean())\r\n        .ForMember(x =\u003e x.BoolValue2, m =\u003e m.Boolean().Null((byte)'-')))\r\n    .ToMapperFactory();\r\n```\r\n\r\n## Converters\r\n\r\n| Converter             | Option | Supported Types                                          | Memo                                               |\r\n|-----------------------|--------|----------------------------------------------------------|----------------------------------------------------|\r\n| ArrayConverter        |        | T[]                                                      | Use with other converters                          |\r\n| BinaryCinverter       |        | int, long, short, double, float                          | Support little endian and big endian               |\r\n| BooleanConverter      |        | bool, bool?                                              | Byte value to boolean                              |\r\n| ByteConverter         |        | byte                                                     | Use byte as it is                                  |\r\n| BytesConverter        |        | byte[]                                                   | Simple byte array copy                             |\r\n| DateTimeTextConverter |        | DateTime, DateTime?, DateTimeOffset, DateTimeOffset?     | Using Encoding and default format and parse method |\r\n| NumberTextConverter   |        | int, int?, long, long?, short, short?, decimal, decimal? | Using Encoding and default format and parse method |\r\n| TextConverter         |        | string                                                   | Using Encoding.GetString()/Encoding.GetBytes()     |\r\n| AsciiConverter        | ✅     | string                                                   | Using custom convert for ascii bytes               |\r\n| DateTimeConverter     | ✅     | DateTime, DateTime?, DateTimeOffset, DateTimeOffset?     | Using custom format and parse method               |\r\n| DecimalConverter      | ✅     | decimal, decimal?                                        | Using custom format and parse method               |\r\n| IntegerConverter      | ✅     | int, int?, long, long?, short, short?                    | Using custom format and parse method               |\r\n\r\n## Configuration\r\n\r\nUse the following method to set the default parameters.\r\n\r\n| Method                          | Option | Default value                | Memo                                                       |\r\n|---------------------------------|--------|------------------------------|------------------------------------------------------------|\r\n| DefaultDelimiter()              |        | 0x0D, 0x0A                   | Record delimiter                                           |\r\n| DefaultEncoding()               |        | Encoding.ASCII               | Used in TextConverter                                      |\r\n| DefaultTrim()                   |        | true                         | Used in TextConverter, AsciiConverter, NumberTextConverter |\r\n| DefaultTextPadding()            |        | Padding.Right                | Used in TextConverter, AsciiConverter                      |\r\n| DefaultFiller()                 |        | 0x20                         | Used in various converters                                 |\r\n| DefaultTextFiller()             |        | 0x20                         | Used in TextConverter, AsciiConverter                      |\r\n| DefaultEndian()                 |        | Endian.Big                   | Used in BinaryConverter                                    |\r\n| DefaultDateTimeKind()           |        | DateTimeKind.Unspecified     | Used in DateTimeConverter                                  |\r\n| DefaultTrueValue()              |        | 0x31                         | Used in BooleanConverter                                   |\r\n| DefaultFalseValue()             |        | 0x30                         | Used in BooleanConverter                                   |\r\n| DefaultDateTimeTextEncoding()   |        | Encoding.ASCII               | Used in DateTimeTextConverter                              |\r\n| DefaultDateTimeTextProvider()   |        | CultureInfo.InvariantCulture | Used in DateTimeTextConverter                              |\r\n| DefaultDateTimeTextStyle()      |        | DateTimeStyles.None          | Used in DateTimeTextConverter                              |\r\n| DefaultNumberTextEncoding()     |        | Encoding.ASCII               | Used in NumberTextConverter                                |\r\n| DefaultNumberTextProvider()     |        | CultureInfo.InvariantCulture | Used in NumberTextConverter                                |\r\n| DefaultNumberTextNumberStyle()  |        | NumberStyles.Integer         | Used in NumberTextConverter                                |\r\n| DefaultNumberTextDecimalStyle() |        | NumberStyles.Number          | Used in NumberTextConverter                                |\r\n| DefaultNumberTextPadding()      |        | Padding.Left                 | Used in NumberTextConverter                                |\r\n| DefaultNumberTextFiller()       |        | 0x20                         | Used in NumberTextConverter                                |\r\n| DefaultNumberPadding()          | ✅     | Padding.Left                 | Used in NumberConverter, DecimalConverter                  |\r\n| DefaultZeroFill()               | ✅     | false                        | Used in NumberConverter, DecimalConverter                  |\r\n| DefaultUseGrouping()            | ✅     | false                        | Used in DecimalConverter                                   |\r\n| DefaultNumberFiller()           | ✅     | 0x20                         | Used in NumberConverter, DecimalConverter                  |\r\n\r\n## Profile\r\n\r\n```csharp\r\nvar mapperFactory = new MapperFactoryConfig()\r\n    .CreateMapByExpression\u003cSampleData\u003e(59, c =\u003e c\r\n        .ForMember(x =\u003e x.Code, m =\u003e m.Ascii(13))\r\n        .ForMember(x =\u003e x.Name, m =\u003e m.Text(20))\r\n        .ForMember(x =\u003e x.Qty, m =\u003e m.Integer(6))\r\n        .ForMember(x =\u003e x.Price, m =\u003e m.Decimal(10, 2))\r\n        .ForMember(x =\u003e x.Date, m =\u003e m.DateTime(\"yyyyMMdd\")))\r\n    .CreateMapByExpression\u003cSampleData\u003e(\"short\", 35, c =\u003e c\r\n        .ForMember(x =\u003e x.Code, m =\u003e m.Ascii(13))\r\n        .ForMember(x =\u003e x.Name, m =\u003e m.Text(20)))\r\n    .ToMapperFactory();\r\n\r\n// default profile\r\nvar mapper1 = mapperFactory.Create\u003cSampleData\u003e();\r\n\r\n// short profile\r\nvar mapper2 = mapperFactory.Create\u003cSampleData\u003e(\"short\");\r\n```\r\n\r\n## ASP.NET Core integration\r\n\r\n```csharp\r\n// Add formatter in Startup\r\nservices.AddMvc(options =\u003e\r\n{\r\n    var config = new ByteMapperFormatterConfig { MapperFactory = mapperFactory };\r\n    config.SupportedMediaTypes.Add(\"text/x-fixedrecord\");\r\n    options.OutputFormatters.Add(new ByteMapperOutputFormatter(config));\r\n    options.InputFormatters.Add(new ByteMapperInputFormatter(config));\r\n});\r\n```\r\n\r\n```csharp\r\n// Controller method\r\n[Produces(\"text/x-fixedrecord\")]\r\n[HttpGet]\r\npublic SampleData[] GetArray()\r\n{\r\n    return new SampleData[] { ... };\r\n}\r\n\r\n[Produces(\"text/x-fixedrecord\")]\r\n[HttpGet]\r\npublic SampleData GetSingle()\r\n{\r\n    return new SampleData { ... };\r\n}\r\n\r\n[Produces(\"text/x-fixedrecord\")]\r\n[ByteMapperProfile(\"short\")]\r\n[HttpGet]\r\npublic SampleData[] GetProfileArray()\r\n{\r\n    return new SampleData[] { ... };\r\n}\r\n\r\n[HttpPost]\r\npublic IActionResult PostArray([FromBody] SampleData[] values)\r\n{\r\n    return Ok();\r\n}\r\n```\r\n\r\n## Implement custom converter\r\n\r\n### Converter\r\n\r\nImplement `IMapConverter`.\r\n\r\n```csharp\r\npublic interface IMapConverter\r\n{\r\n    object Read(byte[] buffer, int index);\r\n\r\n    void Write(byte[] buffer, int index, object value);\r\n}\r\n```\r\n\r\n* Example\r\n\r\n```csharp\r\ninternal sealed class MyBooleanConverter : IMapConverter\r\n{\r\n    private readonly byte trueValue;\r\n\r\n    private readonly byte falseValue;\r\n\r\n    public BooleanConverter(byte trueValue, byte falseValue)\r\n    {\r\n        this.trueValue = trueValue;\r\n        this.falseValue = falseValue;\r\n    }\r\n\r\n    public object Read(byte[] buffer, int index)\r\n    {\r\n        return buffer[index] == trueValue;\r\n    }\r\n\r\n    public void Write(byte[] buffer, int index, object value)\r\n    {\r\n        buffer[index] = (bool)value ? trueValue : falseValue;\r\n    }\r\n}\r\n```\r\n\r\n### ConverterBuilder\r\n\r\nImplement `IMapConverterBuilder`.\r\n\r\n```csharp\r\npublic interface IMapConverterBuilder\r\n{\r\n    bool Match(Type type);\r\n\r\n    int CalcSize(Type type);\r\n\r\n    IMapConverter CreateConverter(IBuilderContext context, Type type);\r\n}\r\n```\r\n\r\nHelper class AbstractMapConverterBuilder is prepared, it is used as follows.\r\n\r\n* Example\r\n\r\n```csharp\r\npublic sealed class MyBooleanConverterBuilder : AbstractMapConverterBuilder\u003cBooleanConverterBuilder\u003e\r\n{\r\n    public byte? TrueValue { get; set; }\r\n\r\n    public byte? FalseValue { get; set; }\r\n\r\n    static BooleanConverterBuilder()\r\n    {\r\n        AddEntry(typeof(bool), 1, (b, t, c) =\u003e b.CreateBooleanConverter(c));\r\n    }\r\n\r\n    private IMapConverter CreateBooleanConverter(IBuilderContext context)\r\n    {\r\n        return new MyBooleanConverter(\r\n            TrueValue ?? context.GetParameter\u003cbyte\u003e(MyParameter.TrueValue),\r\n            FalseValue ?? context.GetParameter\u003cbyte\u003e(MyParameter.FalseValue));\r\n    }\r\n}\r\n```\r\n\r\n### For Attribute\r\n\r\nCreate a derived class of AbstractMemberMapAttribute that wraps Builder.\r\n\r\n* Example\r\n\r\n```csharp\r\npublic sealed class MapMyBooleanAttribute : AbstractMemberMapAttribute\r\n{\r\n    private readonly MyBooleanConverterBuilder builder = new MyBooleanConverterBuilder();\r\n\r\n    public byte TrueValue\r\n    {\r\n        get =\u003e throw new NotSupportedException();\r\n        set =\u003e builder.TrueValue = value;\r\n    }\r\n\r\n    public byte FalseValue\r\n    {\r\n        get =\u003e throw new NotSupportedException();\r\n        set =\u003e builder.FalseValue = value;\r\n    }\r\n\r\n    public MapMyBooleanAttribute(int offset)\r\n        : base(offset)\r\n    {\r\n    }\r\n\r\n    public override IMapConverterBuilder GetConverterBuilder()\r\n    {\r\n        return builder;\r\n    }\r\n}\r\n```\r\n\r\n### For Expressions\r\n\r\nImplement `IMemberMapExpression`.\r\n\r\n```csharp\r\npublic interface IMemberMapExpression\r\n{\r\n    IMapConverterBuilder GetMapConverterBuilder();\r\n}\r\n```\r\n\r\n* Example\r\n\r\nDeclare the Syntax interface for the option and implement it with `IMemberMapExpression`.\r\n\r\n```csharp\r\npublic interface IMapMyBooleanSyntax\r\n{\r\n    IMapMyBooleanSyntax True(byte value);\r\n\r\n    IMapMyBooleanSyntax False(byte value);\r\n}\r\n\r\ninternal sealed class MapMyBooleanExpression : IMemberMapExpression, IMapMyBooleanSyntax\r\n{\r\n    private readonly MyBooleanConverterBuilder builder = new MyBooleanConverterBuilder();\r\n\r\n    public IMapMyBooleanSyntax True(byte value)\r\n    {\r\n        builder.TrueValue = value;\r\n        return this;\r\n    }\r\n\r\n    public IMapMyBooleanSyntax False(byte value)\r\n    {\r\n        builder.FalseValue = value;\r\n        return this;\r\n    }\r\n\r\n    IMapConverterBuilder IMemberMapExpression.GetMapConverterBuilder()\r\n    {\r\n        return builder;\r\n    }\r\n}\r\n```\r\n\r\nAlso define extension methods.\r\n\r\n```csharp\r\npublic static IMapMyBooleanSyntax MyBoolean(this IMemberMapConfigSyntax syntax)\r\n{\r\n    var expression = new MapMyBooleanExpression();\r\n    syntax.Map(expression);\r\n    return expression;\r\n}\r\n```\r\n\r\n### Default parameter\r\n\r\nIf default parameters are used, the following definitions are also prepared.\r\n\r\n```csharp\r\n// Parameter definition\r\npublic static class MyParameter\r\n{\r\n    public const string TrueValue = nameof(MyParameter) + \".\" + nameof(TrueValue);\r\n\r\n    public const string FalseValue = nameof(MyParameter) + \".\" + nameof(FalseValue);\r\n}\r\n```\r\n\r\n```csharp\r\n// Config default extension method\r\npublic static MapperFactoryConfig DefaultTrueValue(this MapperFactoryConfig config, byte value)\r\n{\r\n    return config.AddMyParameter(MyParameter.TrueValue, value);\r\n}\r\n\r\npublic static MapperFactoryConfig UseMyOptionsDefault(this MapperFactoryConfig config)\r\n{\r\n    this.DefaultTrueValue(0x31);\r\n    this.DefaultFalseValue(0x30);\r\n    return config;\r\n}\r\n```\r\n\r\n```csharp\r\n// Type default config for map by attribute\r\n[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]\r\npublic sealed class TypeTrueValueAttribute : Attribute, ITypeDefaultAttribute\r\n{\r\n    public string Key =\u003e MyParameter.TrueValue;\r\n\r\n    public object Value { get; }\r\n\r\n    public TypeTrueValueAttribute(byte value)\r\n    {\r\n        Value = value;\r\n    }\r\n}\r\n```\r\n\r\n```csharp\r\n// Type default config for map by expressions\r\npublic static ITypeConfigSyntax\u003cT\u003e TypeTrueValue\u003cT\u003e(this ITypeConfigSyntax\u003cT\u003e syntax, byte value)\r\n{\r\n    return syntax.TypeDefault(MyParameter.TrueValue, value);\r\n}\r\n```\r\n\r\n## Future\r\n\r\n* Add Nullable support to BinaryCoverter.\r\n* Add Guid support to BinaryCoverter(?).\r\n* Add Double and Float support to NumberTextCoverter.\r\n* Add DoubleConverter and FloatConverter.\r\n* Performance improvements using Span.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusausa%2Fsmart-net-bytemapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fusausa%2Fsmart-net-bytemapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusausa%2Fsmart-net-bytemapper/lists"}