Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中将十进制字符串值转换为十六进制字节数组?_C#_Arrays_Hex_Bytearray - Fatal编程技术网

如何在C#中将十进制字符串值转换为十六进制字节数组?

如何在C#中将十进制字符串值转换为十六进制字节数组?,c#,arrays,hex,bytearray,C#,Arrays,Hex,Bytearray,我有一个十进制格式的输入字符串: var decString = "12345678"; // in hex this is 0xBC614E 我想把它转换成一个固定长度的十六进制字节数组: byte hexBytes[] // = { 0x00, 0x00, 0xBC, 0x61, 0x4E } 我已经想出了一些相当复杂的方法来做到这一点,但我怀疑有一个整洁的两行!有什么想法吗?谢谢 更新: 好的,我想我可能无意中增加了复杂性,因为示例显示了5个字节。最大值实际上是4字节(FF)=4294

我有一个十进制格式的输入字符串:

var decString = "12345678"; // in hex this is 0xBC614E
我想把它转换成一个固定长度的十六进制字节数组:

byte hexBytes[] // = { 0x00, 0x00, 0xBC, 0x61, 0x4E }
我已经想出了一些相当复杂的方法来做到这一点,但我怀疑有一个整洁的两行!有什么想法吗?谢谢

更新:


好的,我想我可能无意中增加了复杂性,因为示例显示了5个字节。最大值实际上是4字节(FF)=4294967295。Int64很好。

要将字符串转换为字节,可以使用:

如果字符串并非始终是32位整数,请使用适当的类型,而不是
Int32

然后,如果需要,您可以检查长度并添加填充字节:

if (byteArray.Length < 5)
{
    var newArray = new byte[5];
    Array.Copy(byteArray, 0, newArray, 5 - byteArray.Length, byteArray.Length);
    byteArray = newArray;
}
if(byteArray.Length<5)
{
var newArray=新字节[5];
复制(byteArray,0,newArray,5-byteArray.Length,byteArray.Length);
byteArray=newArray;
}

如果您对整数的大小没有特别的限制,您可以使用执行此转换:

var b = BigInteger.Parse("12345678");
var bb = b.ToByteArray();
foreach (var s in bb) {
    Console.Write("{0:x} ", s);
}
这张照片

4e 61 bc 0
如果字节顺序很重要,则可能需要反转字节数组

最大值实际上是4个字节
(FF-FF-FF)=4294967295

您可以为此使用
uint
,如下所示:

uint data = uint.Parse("12345678");
byte[] bytes = new[] {
    (byte)((data>>24) & 0xFF)
,   (byte)((data>>16) & 0xFF)
,   (byte)((data>>8) & 0xFF)
,   (byte)((data>>0) & 0xFF)
};

您可以使用Linq:

  String source = "12345678";

  // "BC614E"
  String result = String.Join("", BigInteger
    .Parse(source)
    .ToByteArray()
    .Reverse()
    .SkipWhile(item => item == 0)
    .Select(item => item.ToString("X2")));
如果您想要
字节[]
它将是

   // [0xBC, 0x61, 0x4E]
   Byte[] result = BigInteger
     .Parse(source)
     .ToByteArray()
     .Reverse()
     .SkipWhile(item => item == 0)
     .ToArray();

为什么不给我们看看你有什么?你知道你需要处理的最大值和最小值吗?如果你只需要四个字节,Int32也可以。还有
数组。反转
,因为它似乎需要大端输出。这在哪里生成定长数组(
我想把它转换成定长十六进制字节数组
)?@ChrFin这给了OP一个可变大小的数组,他可以自由扩展。重要的是,这种方法不会截断他的数据或引发异常,无论提供了多少个十进制数字。谢谢@dasblinkenlight两行回答-谢谢演示!假设十进制字符串表示一个适合32位整数的值。谢谢-这肯定是对我尝试的改进!在接受最好的答案之前,我会给你一点时间,你永远不会知道;-)可以跳过3个字节以给出与OP相同的结果:
var result=BitConverter.GetBytes(ulong.Parse(decString)).Reverse().skip(3.ToArray()
   // [0xBC, 0x61, 0x4E]
   Byte[] result = BigInteger
     .Parse(source)
     .ToByteArray()
     .Reverse()
     .SkipWhile(item => item == 0)
     .ToArray();