- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正致力于在 .net 核心中编写自己的 DNS 服务器。我正处于对响应有效负载进行编码以发回的阶段,架构显示大多数数字都编码为 16 位数字。 C# 的整数是 32 位数字。没什么大不了的,我只是去掉数字前面剩余的 16 位,我对此没有问题。
在我发现 System.BitConverter 类之前,我一直在手动执行此操作。然而,我尝试使用它,我得到的结果与它得出的结果相反。
例如:
using System;
var myInt = 15;
byte[] data = new byte[2];
data[0] = (byte)(myInt >> 8);
data[1] = (byte)(myInt & 255);
var myIntStr = "";
foreach(var b in data)
{
myIntStr += System.Convert.ToHexString(new byte[]{ b });
myIntStr += " ";
}
Console.WriteLine(myIntStr);
var myShort = System.Convert.ToInt16(myInt);
byte[] data2 = System.BitConverter.GetBytes(myShort);
myIntStr = "";
foreach(var b in data2)
{
myIntStr += System.Convert.ToHexString(new byte[]{ b });
myIntStr += " ";
}
Console.WriteLine(myIntStr);
此代码产生以下结果:
00 0F
0F 00
我的理解是 000F 是 15,而 0F00 是 3840。我是不是没有正确理解位移位?从字面上看,我昨晚才开始使用实际的位,哈哈。
感谢阅读本文并提前感谢您的帮助!
最佳答案
根据对问题的评论,答案在于字节顺序。
从我用来测试的 dig
命令发送的网络字节顺序使用 Big Endian 顺序。但是,我的 CPU 架构是 Small Endian。
如果您的系统在发送字节时是 Small Endian,则 Dotnet 在其 UDPClient 类的幕后会反转字节,而在接收字节时反之亦然。但是因为我是使用 Big Endian 格式的位移位手动创建字节,所以它们随后被反转为非网络字节顺序,而其他所有内容都是网络字节顺序。
此处的解决方案是使用条件逻辑来测试您的系统是否为 IsLittleEndian
According to the Microsoft dotnet docs ,或者让 System.BitConverter
类为您处理。
例如:在我上面的示例中,我试图将 32 位 int 转换为 16 位无符号位。我最终将上面的代码替换为:
public static byte[] IntTo16Bit(int input)
{
ushort input16;
if (!UInt16.TryParse(input.ToString(), out input16))
{
throw new Exception($"Input was {input}");
}
if (BitConverter.IsLittleEndian)
{
return BitConverter.GetBytes(input16).Reverse().ToArray();
}
return BitConverter.GetBytes(input16);
}
并计划在 i32 无法转换为 u16 时更好地处理。
关于C# BitConverter.GetBytes() 填充不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70587210/
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
通常情况下,如果你想在字节数组中表示 5,它会像 {0x00,0x00,0x00,0x05} 一样,但 BitConverter 给我反向数组({0x05,0x00,0x00,0x00})为什么会这样
我正致力于在 .net 核心中编写自己的 DNS 服务器。我正处于对响应有效负载进行编码以发回的阶段,架构显示大多数数字都编码为 16 位数字。 C# 的整数是 32 位数字。没什么大不了的,我只是去
我最近一直在研究 BitConverter 的工作原理,并通过阅读其他 SO 问题,我读到,当起始索引可被转换为可以强制转换的类型的大小整除时,它需要一条“捷径”将索引处的字节指针转换为指向要转换为的
我正在使用 BitConverter.ToInt32 将 3 个 byte 值打包成一个 int,如下所示: byte R = 0; byte G = 0; byte B = 0; int i = B
我尝试将 IP 地址转换为长值: byte[] Ip = new byte[4] { 192, 168, 1, 0 }; UInt32 Ret1 = (((UInt32)Ip[0]) << 24) |
我需要获取 UInt16 和 UInt64 中的值作为 Byte[]。目前我正在使用 BitConverter.GetBytes,但这种方法每次都会给我一个新的数组实例。 我想使用一种允许我将这些值“
我需要 C# BitConverter.DoubleToInt64Bits(doubleValue) 的 Swift 实现。我发现网站上的 C# 实现只是 https://referencesourc
我的代码旨在提取 4 字节消息中的两个中间字节,然后附加两个中间字节以形成一个 16 位无符号整数。不幸的是,我在使用 BitConverter.ToUint16 时遇到问题 - 我的代码似乎无法正常
创建起来非常简单。我有一个简单的字节数组,证明它在运行时有数据: 那我就干 var bytedata = BitConverter.ToUInt32(byte_array,0); 它可以编译,但我在运
这是一个方法- using System; class Program { static void Main(string[] args) { // /
我最近遇到一种情况,我需要创建一个通用方法来从字节数组中读取数据类型。 我创建了以下类: public class DataStream { public int Offset { get;
这个问题在这里已经有了答案: How do you convert a byte array to a hexadecimal string, and vice versa? (52 个答案) 关闭
我正在尝试将一些使用 BitConverter 的现有 C# 代码移植到 Java。我发现了各种其他线程,但后来偶然发现了一个 github 类,它似乎可以解决这个问题。但是,ToUInt16 与我的
在我的程序中,我有一个 PacketFactory,它构建准备好通过 NetworkStream 发送的缓冲区。正如您在下面看到的,此方法采用 short 作为参数。此短消息传递给 BitConver
我正在尝试使用 BitConverter.GetBytes 获取不同类型的不同对象的字节数.为此,我想编写一个通用扩展方法,而不是为我想使用的每种类型(短、长、ulong 等)编写单独的扩展方法。 这
我想知道是否存在与 .Net 的 BitConverter.GetBytes() 方法等效的 Objective C。 例如,在C#中,我可以这样写: byte[] lengthPrefix = Bi
我正在尝试读取文件的 PE header 以获取一些信息。对于 .NET 和 C#,我使用 BitConverter 将读取文件后获得的字节数组转换为等效的整数。我希望对 C++ 做同样的事情,但不确
BitConverter.ToString 给出格式为 'XX-XX-XX-XX' 的十六进制数 是否有相反的方法,以便我可以从以这种格式给出的字符串中获取原始字节数组? 最佳答案 没有,但是很容易实
只是想知道是否有人可以解释为什么以下两行代码返回“不同”的结果?是什么导致了相反的值(value)观?这与字节顺序有关吗? int.MaxValue.ToString("X") //Result: 7
我是一名优秀的程序员,十分优秀!