【问题标题】:Replacing byte based on index value in C#在C#中根据索引值替换字节
【发布时间】:2018-09-28 22:17:33
【问题描述】:

我正在尝试编写一个控制台应用程序,它将数据作为输入并将其分成两个

示例:如果我将值 0x00000000A0DB383E 作为输入传递,我的输出应如下所示:

var LowerValue = 0x00000000A0DB0000 (last 2 bytes 383E (index 14-17) replaced with 0000)
var UpperValue = 0x000000000000383E (middle 2 bytes A0DB (index 10-13) replaced with 0000)

到目前为止,我已经在下面尝试过,但不知道如何进一步进行。任何帮助将不胜感激

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace SplitFunction
{
    class Program
    {
        static void Main(string[] args)
        {
        byte[] rawValue = BitConverter.GetBytes(0x00000000A0DB383E);
        SplitData(rawValue);
        Console.ReadKey();
        }

        public static byte[] SplitDta(byte[] input)
        {
            byte[] lowerValues =  new byte[8];
            Array.Copy(input, 0, lowerValues, 4, 4);
            foreach(var lowerValue in lowerValues)
                Console.WriteLine(lowerValue);
            return lowerValues;
        }
    }
}

【问题讨论】:

  • 你的输入是字节数组吗?
  • 嗨@paulF是的
  • 您确实意识到该值仅包含 4 个字节,对吧?只需检查 rawValue 数组即可。
  • 您的代码显示您正在传递一个长值并转换为一个数组 - 这就是您想要的吗?或者你想以长值结束。请注意,GetBytes 可能会首先为您提供一个低字节数组,而不是最后一个。
  • @juharr 好吧,他在顶部 2 + 2 个字节说,然后他使用 8 个字节..

标签: c# hex byte


【解决方案1】:

与其复制和归零单个数组元素,不如使用掩码直接创建新数组。像这样:

long input = 0x0000000A0DB383EL;

byte[] rawValue = BitConverter.GetBytes(input);
byte[] lowValue = BitConverter.GetBytes(input & 0x000000000000FFFF);
byte[] highValue = BitConverter.GetBytes(input & 0x00000000FFFF0000);

如果您希望值按高字节到低字节的顺序排列 - 然后将它们反转

byte[] rawValue = Array.Reverse(BitConverter.GetBytes(input));
byte[] lowValue = Array.Reverse(BitConverter.GetBytes(input & 0x000000000000FFFF));
byte[] highValue = Array.Reverse(BitConverter.GetBytes(input & 0x00000000FFFF0000));

如果您只是想要长值而不是数组

long lowValue = input & 0x000000000000FFFF;
long highValue = input & 0x00000000FFFF0000;

【讨论】:

  • 嗨@PaulF 谢谢你的时间。第一个解决方案是我正在寻找的解决方案。我还有另一个问题,它可能是一个愚蠢的问题,如何将 lowValue 和 highvalue 转换/表示为 0x0000000A0DB0000 和 0x0000000A0DB000
  • 我不确定我是否理解您所说的将 lowValue 表示为 0x0000000A0DB0000 的意思(我认为 highValue 相同是一个错字)。如果您想要长值 - 那么答案的最后一部分就是您所需要的。还是您的意思是打印该值?
  • 我的不好,对不起我的英语不好,我在问如何打印。我已经想通了。非常感谢@PaulF
猜你喜欢
  • 2016-10-10
  • 2019-03-22
  • 1970-01-01
  • 2022-08-18
  • 2017-01-09
  • 1970-01-01
  • 2016-08-28
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多