我有一个 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;
}
然而,这会将值转换为等效的十六进制值。但是这些值已经在 hex 中了!
例如,这使得 "10" "0F" "3E" "42"
进入"16" "15" "62" "66"
.
我希望它直接复制值,因为它们已经是正确的十六进制值。
编辑:
基本上...
我想要一个字节数组,其中包含 String[]
中的文字字符所以说 String[]
中的第二个值是0F
.我想要 Byte[]
中的第一个字节成为0F
而不是 16
有什么想法吗?
编辑2
让我澄清一下。我不想转换我的 String[]
值转换为十六进制,因为它们已经是十六进制。我想直接将它们复制到一个 Byte[]
问题是我的字符串值"10" "0F" "3E" 42"
已经有了我想要的十六进制值。我希望字节数组包含那些确切的值而不是转换它们,它们已经是十六进制形式。
最佳答案
你必须转换(或解析)string
才能得到byte
,因为string
和 byte
是不同的类型:
// 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
如果你想处理一个数组,你可以尝试一个简单的Linq:
using System.Linq;
...
string[] hexValues = new string[] {
"10", "0F", "3E", "42"};
byte[] result = hexValues
.Select(value => Convert.ToByte(value, 16))
.ToArray();
如果要将结果
打印为十六进制,请使用格式化("X2"
格式字符串 - 至少2
十六进制 数字,使用大写 字母):
// 10, 0F, 3E, 42
Console.Write(string.Join(", ", result.Select(b => b.ToString("X2"))));
与相同但格式不同的数组进行比较("d2"
- 至少2
十进制 位数)
// 16, 15, 62, 66
Console.Write(string.Join(", ", result.Select(b => b.ToString("d2"))));
如果未提供格式,.Net 使用默认格式并以十进制表示 byte
:
// 16, 15, 62, 66
Console.Write(string.Join(", ", result));
关于C# 将十六进制字符串数组转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52615373/