Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_.net_Hex - Fatal编程技术网

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