【发布时间】:2021-07-25 15:32:02
【问题描述】:
我满足了查看某些数据(tcp 数据包、文件、某些数据结构的二进制序列化......)的二进制/十六进制表示的需要,似乎我总是偶然发现与字节序和相同的问题每次写字符串转换的字节顺序。
关于这个话题已经有其他问题了,但我的具体实现似乎有些问题。
我尝试自己编写一些函数来将任何字节/字节数组转换为二进制字符串(以 8 个块为单位,因为包含的函数只给出“使用的位”),但问题是我得到了不同的结果。而且我不知道在哪里需要注意底层系统的字节序。
class Program
{
static void Main(string[] args)
{
//ushort x = 13;
ushort x = 3328;
string res = ToBinaryString(x);
string res2 = ToBinaryString(BitConverter.GetBytes(x));
Console.WriteLine("res: " + res + "\r\n" + "res2: " + res2);
}
public static string ToBinaryString(byte v)
{
return Convert.ToString(v, 2).PadLeft(8, '0');
}
public static string ToBinaryString(byte[] v)
{
string[] strArr = new string[v.Length];
for(int i = 0; i < v.Length; i++)
{
strArr[i] = ToBinaryString(v[i]);
}
return string.Join("", strArr);
}
public static string ToBinaryString(ushort v)
{
return Convert.ToString(v, 2).PadLeft(16, '0');
}
}
}
意外的不同输出是:
res: 0000110100000000
res2: 0000000000001101
所以我有点困惑,因为到目前为止,我认为这两种方法会返回相同(正确)的结果,而不是不同的结果。
值得注意的是:我在 Windows 开发机器上。
【问题讨论】:
-
您在寻找
IsLittleEndian吗?但与其明确检查字节顺序,不如使用NetworkToHostOrder之类的东西。 -
没有。目前我还没有检查 IsLittleEndian 但我已经在考虑在哪里使用它(在 ToBinaryString(ushort) 或 toBinaryString(byte[]) 方法中。由于这些方法与网络无关,我不确定 NetworkToHostOrder 是否可用对我来说现在。但是当我使用调试TCP数据包的功能时,肯定会出现。
-
@monty 需要注意的是,BitConverter.GetBytes 方法返回的数组中的字节顺序取决于机器是小端还是大端。 IE。 byteArray[0] 包含 little-endian 机器上的最低有效字节和 big-endian 机器上的最高有效字节。但我的回答只尊重小端。 docs.microsoft.com/en-us/dotnet/api/…
标签: c# binary endianness