C#将十六进制字符串数组转换为字节数组

时间:2018-10-02 19:46:08

标签: c# hex

我存储了一个String [],其十六进制值为“ 10”“ 0F”“ 3E”“ 42”。

我发现此方法可以转换为Byte []

    public static byte[] ToByteArray(String HexString)
    {
        int NumberChars = HexString.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
        {
            bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);
        }
        return bytes;
    }

但是,这会将值转换为十六进制等效值。但是这些值已经等于十六进制!

例如,将“ 10”,“ 0F”,“ 3E”,“ 42”变成“ 16”,“ 15”,“ 62”,“ 66”。

我希望它直接复制值,因为它们已经是正确的十六进制值。

编辑:

基本上...

我想要一个带有String []中文字字符的字节数组,所以说String []中的第二个值是0F。我希望Byte []中的第一个字节为0F,而不是16

有什么想法吗?

Edit2

让我澄清一下。我不想将我的String []值转换为十六进制,因为它们已经是十六进制的。我想直接将它们复制到Byte []

问题是我的值字符串“ 10”“ 0F”“ 3E” 42“已经具有我想要的十六进制值。我希望字节数组包含这些确切值并且不进行转换,它们已经是十六进制形式。

3 个答案:

答案 0 :(得分:0)

您必须转换(或解析string,才能获得byte和{{1}以来的string }是不同类型

byte

如果要处理数组,可以尝试使用简单的 Linq

// 10 == 10d 
byte b = Convert.ToByte("10");     // if "10" is a decimal representation
// 16 == 0x10
byte b = Convert.ToByte("10", 16); // if "10" is a hexadecimal representation

如果您想将using System.Linq; ... string[] hexValues = new string[] { "10", "0F", "3E", "42"}; byte[] result = hexValues .Select(value => Convert.ToByte(value, 16)) .ToArray(); 打印为十六进制 ,请使用格式设置(result格式字符串-至少"X2" 十六进制数字,使用大写字母字母):

2

相同数组进行比较,但格式不同 // 10, 0F, 3E, 42 Console.Write(string.Join(", ", result.Select(b => b.ToString("X2")))); -至少"d2"十进制数字)

2

如果未提供格式,.Net将使用默认格式,并以十进制表示// 16, 15, 62, 66 Console.Write(string.Join(", ", result.Select(b => b.ToString("d2"))));

byte

答案 1 :(得分:0)

您在这里确实混淆了表示形式数字

"0F"这样的字符串可以看作是以16为底的数字的表示形式,即以十进制表示的 16

与将 16 表示为 F 0F XVI IIIIIIIIIIIIIIII 或您选择的其他任何表示形式。

字符串"0F"实际上在内存中看起来像这样

十六进制表示形式

0x30 0x46 0x00 

十进制表示形式

48 70 0

二进制表示形式:

0b00110000 0b01000110 0b00000000

答案 2 :(得分:0)

Byte仅仅是data type,实际上是integer的子集。

Byteinterger的值,范围为-2^7(-128) to 2^7-1$(127)

调用Convert.ToByte(string, 16)只需将您的string转换为等效的hex value,然后转换为byte中的等效值。

请注意,byte data type始终是integer data,但用于代替整数只是为了节省内存空间。如上所述,字节数据类型从-128 to 127中获取值,从而比integer data type节省了更多的内存空间。

请注意,如果您希望转换为hexadecimal的{​​{1}}值小于byte或大于-128

下面的链接显示了当我尝试转换127时将其值转换为string时大于hexadecimal的错误的一个实例。

Error when converting to Byte

每次执行此操作都会收到错误消息。

我希望我的回答和德米特里·拜琴科(Dmitry Bychenko)能够为您的问题提供更多启示。 如果没有,请随时发表评论。