C# 将 2 Int16 加入 Int32
C# join 2 Int16 into Int32
我 运行 陷入了死胡同,因为我认为应该是一个简单的解决方案。
基本上,我有:
List<Uint16> header = new List<UInt16>();
然后我用数据填充它,但后来我需要将几个元素加入 Int32 中,我不知道什么是最好的方法。我可以进行任何 .NET 调用以将这两个连接到 Uint32 中吗?
谢谢
您可以使用位移来完成:
var num = (uint)((header.ElementAt(0) << 16) | header.ElementAt(1));
这是假设 0 处的元素最重要。
您可以使用 Bitwise Operators:
uint num = (uint)((header.ElementAt(0) << 16) | header.ElementAt(1));
如果加入它们意味着使用一个 Uint16 作为 32 位 Uint 的最低 16 位,另一个作为最高 16 位,那么您可以使用按位算术和移位。类似于:
Uint16 u1;
Uint16 u2;
Uint32 = (Uint32)u1 << 16 | (Uint32)u2;
我认为我们还需要注意系统的字节顺序。
Stored value: 0x00000001
In memory representation:
Memory Address
Low High
0 1 2 3
+------+------+------+------+
| 00 | 00 | 00 | 01 | Big Endian Representation
+------+------+------+------+ stores the least significant byte
in higher memory address. So we get
0 in lower address.
Low High
0 1 2 3
+------+------+------+------+
| 01 | 00 | 00 | 00 | Little Endian Representation
+------+------+------+------+ stores the least significant byte
in lower memory address.
因此如果我们需要粘贴两个uint16
那么首先我们需要了解字节顺序。
uint16 val1, val2;
val1
+------+------+ +------+------+
| b1 | b2 | OR | b2 | b1 |
+------+------+ +------+------+
(paste) (paste)
val2
+------+------+ +------+------+
| b3 | b4 | OR | b4 | b3 |
+------+------+ +------+------+
===============================+===============================
paste(val1,val2) | paste(val2,val1)
0 1 2 3 | 0 1 2 3
+------+------+------+------+ | +------+------+------+------+
| b1 | b2 | b3 | b4 | | | b4 | b3 | b2 | b1 |
+------+------+------+------+ | +------+------+------+------+
val1 val2 | val2 val1
LITTLE Endian BIG Endian
因此需要考虑字节顺序。
检查系统的Endinness是否可以使用
endian = (((char *)&x)[0]) ? 0 : 1;
其中 0
是小而 1
是大。 (这里就不解释了)
根据此输出,您可以使用 paste
函数来粘贴 uint16
s。
为了完整起见,我正在编写粘贴功能。
uint32 paste (uint16 n1, uint16 n2)
{
return ((uint32) n1 << 16)| (uint) n2;
}
Function get_DWord(ByVal D1 As Short, ByVal D2 As Short) As Integer
Dim Bits As String = Convert.ToString(D1, 16)
Dim length As Integer = Bits.Length
If length < 4 Then
For I As Integer = 0 To 4 - length
Bits = "0" & Bits
Next
End If
Dim Bits2 As String = Convert.ToString(D2, 16)
Dim No As Integer = Convert.ToInt32(Bits2 & Bits, 2)
Return No
End Function
我 运行 陷入了死胡同,因为我认为应该是一个简单的解决方案。 基本上,我有:
List<Uint16> header = new List<UInt16>();
然后我用数据填充它,但后来我需要将几个元素加入 Int32 中,我不知道什么是最好的方法。我可以进行任何 .NET 调用以将这两个连接到 Uint32 中吗?
谢谢
您可以使用位移来完成:
var num = (uint)((header.ElementAt(0) << 16) | header.ElementAt(1));
这是假设 0 处的元素最重要。
您可以使用 Bitwise Operators:
uint num = (uint)((header.ElementAt(0) << 16) | header.ElementAt(1));
如果加入它们意味着使用一个 Uint16 作为 32 位 Uint 的最低 16 位,另一个作为最高 16 位,那么您可以使用按位算术和移位。类似于:
Uint16 u1;
Uint16 u2;
Uint32 = (Uint32)u1 << 16 | (Uint32)u2;
我认为我们还需要注意系统的字节顺序。
Stored value: 0x00000001 In memory representation: Memory Address Low High 0 1 2 3 +------+------+------+------+ | 00 | 00 | 00 | 01 | Big Endian Representation +------+------+------+------+ stores the least significant byte in higher memory address. So we get 0 in lower address. Low High 0 1 2 3 +------+------+------+------+ | 01 | 00 | 00 | 00 | Little Endian Representation +------+------+------+------+ stores the least significant byte in lower memory address.
因此如果我们需要粘贴两个uint16
那么首先我们需要了解字节顺序。
uint16 val1, val2; val1 +------+------+ +------+------+ | b1 | b2 | OR | b2 | b1 | +------+------+ +------+------+ (paste) (paste) val2 +------+------+ +------+------+ | b3 | b4 | OR | b4 | b3 | +------+------+ +------+------+ ===============================+=============================== paste(val1,val2) | paste(val2,val1) 0 1 2 3 | 0 1 2 3 +------+------+------+------+ | +------+------+------+------+ | b1 | b2 | b3 | b4 | | | b4 | b3 | b2 | b1 | +------+------+------+------+ | +------+------+------+------+ val1 val2 | val2 val1 LITTLE Endian BIG Endian
因此需要考虑字节顺序。
检查系统的Endinness是否可以使用
endian = (((char *)&x)[0]) ? 0 : 1;
其中 0
是小而 1
是大。 (这里就不解释了)
根据此输出,您可以使用 paste
函数来粘贴 uint16
s。
为了完整起见,我正在编写粘贴功能。
uint32 paste (uint16 n1, uint16 n2)
{
return ((uint32) n1 << 16)| (uint) n2;
}
Function get_DWord(ByVal D1 As Short, ByVal D2 As Short) As Integer
Dim Bits As String = Convert.ToString(D1, 16)
Dim length As Integer = Bits.Length
If length < 4 Then
For I As Integer = 0 To 4 - length
Bits = "0" & Bits
Next
End If
Dim Bits2 As String = Convert.ToString(D2, 16)
Dim No As Integer = Convert.ToInt32(Bits2 & Bits, 2)
Return No
End Function