因此,我目前正在try 了解更多关于endianness的知识,以及字节如何转换为Short、Int等.

我想我应该从简单开始,首先把一个短的("30000")字节转换成两个字节,然后存储在一个MemoryStream字节中

private static void WriteShort(short constValue)
{
    _stream.WriteByte((byte)(constValue & 255));
    _stream.WriteByte((byte)(constValue >> 8));
}

如果我理解正确,我首先使用按位and运算符&进行位屏蔽.

0000 0000 1111 1111 &
0111 0101 0011 0000

这将导致一个字节看起来像0011 0000,我会把它写到MemoryStream.MemoryStream包含一个字节数组,看起来像[48]

然后,我根据相同的值30000写入另一个字节,但我将字节向右移位8,以获得最左边的8位0111 0101 (117),并将其作为字节写入MemoryStream.现在字节数组看起来像这样

这一部分对我来说似乎很清楚,是对短片的重构让我有点困惑.

我为什么要在重建短片时做同样的位移位呢?我认为这个问题与我的另一个问题有点关联,"+"运算符如何将"48"和"117"转换为30000?

BitConverter.ToInt16(_stream.ToArray());如何知道要移位什么字节等来输出正确的值?

private static short ReadShort()
{
    _stream.Position = 0;
    return (short)((_stream.ReadByte() & 255) +
                  (_stream.ReadByte() << 8));
}

整个计划

internal class Program
{
    private static MemoryStream _stream;
    static void Main(string[] args)
    {
        Console.WriteLine(117 << 8);

        _stream = new MemoryStream();
        short constValue = 30000;
        WriteShort(constValue);
        var v = ReadShort();

        /* True */
        Console.WriteLine($"Is Little Endian: {BitConverter.IsLittleEndian}");
    }

    private static void WriteShort(short constValue)
    {
        _stream.WriteByte((byte)(constValue & 255));
        _stream.WriteByte((byte)(constValue >> 8));
    }

    private static short ReadShort()
    {
        _stream.Position = 0;
        return (short)((_stream.ReadByte() & 255) +
                      (_stream.ReadByte() << 8));
    }
}

推荐答案

所以你有两个字节,

0011 0000
0111 0101

也可以对两个值进行零扩展,使它们都是16位值:

0000 0000 0011 0000
0000 0000 0111 0101

仅仅把这些数字加在一起显然不会得到原来的数字.我们还可以看到,_stream.ReadByte() & 255_stream.ReadByte()没有任何意义.但是,移动最后一个数字将导致

0000 0000 0011 0000
0111 0101 0000 0000

我们可以看到,把这些数字加在一起或叠加在一起会得到原始值.请注意,BitConverter不一定需要这样做,它可以简单地使用本机代码直接复制字节.当将较大整数转换为字节时,可能需要考虑Endianness,因为根据平台不同,整数将被不同地表示.

Csharp相关问答推荐

在发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

与C#中的Zip列表并行

ASP.NET核心REST API返回一个非常大的数字

如何忽略API JSON响应中的空字符串?

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

GODOT 4向C#中的字符串参数发送信号以等待

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

具有嵌套属性的IGGroup

映射器-如何映射到多个实体

在C#和HttpClient中使用REST API

无法将.Net Framework 4.8.1升级到.Net 7

身份验证中间件如何处理多个方案

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到

为什么我不能在固定语句中使用外部函数?

从具有泛型类型约束的类继承-Blazor

在C#中获取带有泛型的字典的类型名称

引用类型中的值类型属性是否包含装箱的值?

GroupBy()不是';除非我首先将各个项目加载到内存中,否则不会按预期工作

为什么会出错';日历请求生成器';不包含';请求'";graphClient.Me.Calendars.Request().GetAsync();

我如何控制包装板,这样如果我删除了一个项目,订单就不会';t更改