如何获得TypeCode的长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得TypeCode的长度相关的知识,希望对你有一定的参考价值。

我确定这是一个简单的问题,但我没有答案。这是Senario和问题。

我有一个使用特定格式存储的数组。该格式包含一个抬头记录,后面是多个详细记录。记录的标题告诉我使用什么TypeCode来存储数据,例如Int32。

我有一个例程,它接受一个byte []数组,并将字节数据转换回C#中的正确格式。此例程需要适当的字节数才能使转换成功。

Q。因此,如何从给定的TypeCode中获取字节的长度以传递给Convert函数,而不必对每种类型的长度进行硬编码?

答案

鉴于TypeCode只是一组固定值的枚举,您可以轻松地对它们的字典进行硬编码,例如

private static readonly Dictionary<TypeCode,int> TypeCodeLength =
    new Dictionary<TypeCode,int> {
    { TypeCode.Int32, 4 },
    { TypeCode.Int64, 8 },
    { TypeCode.Char, 2 },
    // etc
}

(等效的解决方案是使用switch / case语句-如果您仅包含值,它们实际上是等效的。)

尽管有些,例如stringobject将是可变的-其他则取决于您对DateTime之类的编码方式。

除非这使用标准转换,否则框架中的任何内容都将无法为您提供长度。我知道硬编码通常不被接受,但是在这种情况下,硬编码只在一个地方,并且将是最简单的选择。

另一答案

根据How to create Type from TypeCode...,您不能(没有详尽的开关)。当然,另一个方向(Type-> TypeCode)是微不足道的。

另一答案

答案已经给出,但是我在下面提供了完整的例程,供有需要的人重复使用:

/// <summary>
/// Helper class for manipulations at but level
/// </summary>
public static class BitHelper
{
    /// <summary>
    /// Get a TypeCode bytes length
    /// See : https://docs.microsoft.com/en-us/dotnet/api/system.typecode?view=netcore-3.1
    /// </summary>
    /// <param name="typeCode"></param>
    /// <returns></returns>
    public static byte GetTypeCodeByteLength(TypeCode typeCode)
    {
        byte bytesLength = 0;

        switch (typeCode)
        {
            case TypeCode.Object:
                bytesLength = 4;
                break;
            case TypeCode.DBNull:
                bytesLength = 4;
                break;
            case TypeCode.Boolean:
                bytesLength = 1;
                break;
            case TypeCode.Char:
                bytesLength = 2;
                break;
            case TypeCode.SByte:
                bytesLength = 1;
                break;
            case TypeCode.Byte:
                bytesLength = 1;
                break;
            case TypeCode.Int16:
                bytesLength = 2;
                break;
            case TypeCode.UInt16:
                bytesLength = 2;
                break;
            case TypeCode.Int32:
                bytesLength = 4;
                break;
            case TypeCode.UInt32:
                bytesLength = 4;
                break;
            case TypeCode.Int64:
                bytesLength = 8;
                break;
            case TypeCode.UInt64:
                bytesLength = 8;
                break;
            case TypeCode.Single:
                bytesLength = 4;
                break;
            case TypeCode.Double:
                bytesLength = 8;
                break;
            case TypeCode.Decimal:
                bytesLength = 16;
                break;
            case TypeCode.DateTime:
                bytesLength = 8;
                break;
            case TypeCode.String:
                bytesLength = 4;
                break;
            default:
                // Error
                break;
        }

        return bytesLength;
    }
}

问候

以上是关于如何获得TypeCode的长度的主要内容,如果未能解决你的问题,请参考以下文章

如何将这个 Objective-C 代码片段写入 Swift?

如何以毫秒为单位获取javaFX音频片段的长度[关闭]

如何创建工具提示?

第2题——DNA片段

如何在切换片段时停止 AsyncTask?

如何获得 std::string 的准确长度?