【发布时间】:2023-03-17 03:52:02
【问题描述】:
这是我的功能的要求:
取以下字符串:
6900460420006149231=13050010300100000
并将其转换为以下字节数组:
{ 0x37, 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31, 0xD1, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
第一个字节 0x37 是二进制字符串的原始长度。接下来的 10 个字节是以 bcd 格式编码的字符串“6900460420006149231”。这就是棘手的地方。现在我需要十六进制“D”来表示两个字段之间的分隔符(=)。您可以在字节数组中的 12 索引的高半字节中看到十六进制。字节数组的其余部分是以 bcd 格式编码的第二个字段“13050010300100000”。如果原始长度是奇数,我会在未使用数据的前半字节填充前导零。
我不希望任何人都能全面实施,所以让我们分解一下并解决我遇到问题的地方。 假设我有:
byte[] field1Bytes = { 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31 }
byte[] field2Bytes = { 0x01, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
byte separator = 13; // D 0x0D
如果我只是使用 Array.Copy,我最终会得到:
{ 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31, 0x0D, 0x01, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
上面的字节数组并不是我所需要的。关于如何实现以下函数以使我更接近我想要实现的目标的任何想法:
byte[] ShiftLeftAndCombine(byte[] b1, byte[] b2)
在哪里
ShiftLeftAndCombine({0x0d}, {0x01, 0x30})
会返回
{0xd1, 0x30}
- 在旁注中,我意识到我需要处理偶数/奇数字段长度来处理我正在编写的实际函数,但让我担心 =]
【问题讨论】:
-
不,它的工作正常。我得到报酬...
-
哈哈好吧,不确定,因为这听起来像是一个家庭作业问题! :) 我在下面的回答假设是作业,如果您需要,我会更新它...
标签: c# bytearray bit-manipulation