C# 理解十六进制值
我是一个白手起家的程序员,所以我对位、字节和十六进制值知之甚少 我使用的一个库以字节数组的形式从远程服务接收数据。我找到了一种转换此字节数组数据的方法:C# 理解十六进制值,c#,.net,hex,C#,.net,Hex,我是一个白手起家的程序员,所以我对位、字节和十六进制值知之甚少 我使用的一个库以字节数组的形式从远程服务接收数据。我找到了一种转换此字节数组数据的方法: public string ByteArrayToHexString(byte[] buf) { if (buf == null) return ""; StringBuilder sb = new StringBuilder(buf.Length * 2 + 2); for (int i = 0; i < b
public string ByteArrayToHexString(byte[] buf)
{
if (buf == null) return "";
StringBuilder sb = new StringBuilder(buf.Length * 2 + 2);
for (int i = 0; i < buf.Length; i++)
{
sb.Append(buf[i].ToString("x2"));
}
return sb.ToString();
}
或
或
这些实际值是由服务发送的还是需要进一步转换?我应该怎么做才能得到实际值呢?我不会试图回答关于字节值的含义,或者它们是否“正确”的问题,因为根据这里提供的信息,我们无法知道。相反,我将带您逐步完成转换,以回答您的问题“这些实际值是由服务发送的吗?” 一个
byte[]
是一个字节数组-一个“字节数组”
数组是一组固定大小的值
C#中的byte
对象是一个范围介于十进制数字0和255之间的值
所以“字节数组”实际上只是一组数字,按顺序排列,所有数字都在0到255之间
十六进制值只是可视化字节数组的一种方法
(为了完全清楚起见,十六进制是以16为基数,十进制是以10为基数。)
以下各列中的数字是等效的
decimal 0 5 10 15 16 20 26 255
decimal 0 05 10 15 16 20 26 255 (padded with zero)
hex 0 5 a f 10 14 1A FF
hex 0 05 0a 0f 10 14 1A FF (padded with zero)
因此,想象一个具有以下十进制值的字节数组:
4, 12, 255, 1, 0
4, c, ff, 1, 0
这相当于具有以下十六进制值的字节数组:
4, 12, 255, 1, 0
4, c, ff, 1, 0
这也可以写成:
04, 0c, ff, 01, 00
或者更常见的是:
0x04, 0x0c, 0xff, 0x01, 0x00
或:
或:
因此,如果您的服务返回一个字节数组,并且您看到的值类似于002d
,这意味着您收到了两个字节,第一个字节是0(0在10进制和16进制中是相同的),第二个字节是2d(十六进制),也可以用十进制(10进制)表示为45
简而言之,尽管您没有告诉我们,是的,这些十六进制值确实表示从服务接收到的实际值。要将字节数组转换为十六进制字符串,最好使用内置方法 但是,web方法返回的实际值的类型为
byte[]
。将其转换为十六进制字符串只是表示它的另一种方式
将其显示为以逗号分隔的十进制字节值列表可能更方便
byte[] returnValue = ...
var commaDelimmitedListOfByteValues =
string.Join(",", returnValue.Select(v => c.ToString()));
这会给你一些类似于“1254,23,67111,23,…”
在不知道返回的内容和原因的情况下,我们无法推测字节[]
的“真实”含义
在这种情况下,价值何在
"0031" //Your Hex String
"00-31" //BitConvertor Hex String
{ 0, 49 } //Array Inline Initializer
"0,49" //Comma delimited list of decimal byte values
49 //Possible conversion to an Int32
'1' //Possible conversion to a Char
所有这些都可能是返回值的有效表示形式
会是这样吗 “0031”='1' “0022”='“” “002d”='-'
一切都是猜测。
我应该怎么做才能得到实际值?
-我们不知道。这些代表什么?需要什么预期结果?是让自己学习的好时机。鉴于您的方法被称为ByteArrayToHexString,它看起来像是在它的工作中测量@Oded状态,我们不可能知道字节是什么n任意的字节
数组
表示它们是否正确。将字节转换为十六进制文本字符串对任何一种方式都没有多大帮助。web方法的签名是什么?您希望它做什么?字节【】
可以是任何其他类型的二进制序列化,也可以是其他类型。术语“反序列化”的错误用法是,buf[0]为0x00(十进制0),buf[1]为0x22(十进制34)。这与我的答案有什么关系?这只是一个问题。没有多大价值,因此我将删除。谢谢。我意识到,如果不知道基本结构,我的问题无法得到回答。我将接受此信息作为答案。谢谢。
040cff0100
byte[] returnValue = ...
var commaDelimmitedListOfByteValues =
string.Join(",", returnValue.Select(v => c.ToString()));
"0031" //Your Hex String
"00-31" //BitConvertor Hex String
{ 0, 49 } //Array Inline Initializer
"0,49" //Comma delimited list of decimal byte values
49 //Possible conversion to an Int32
'1' //Possible conversion to a Char