C# BCD编码解码

(1)BCD码(二到十进制编码)
人们通常习惯使用十进制数,而计算机内部多采用二进制表示和处理数值数据,
因此在计算机输入和输出数据时,就要进行由十进制到二进制的转换处理。

把十进制数的每一位分别写成二进制形式的编码,称为二进制编码的十进制数,
即二到十进制编码或BCD(Binary Coded Decimal)编码。

BCD码编码方法很多,通常采用8421编码,这种编码方法最自然简单。
其方法使用四位二进制数表示一位十进制数,从左到右每一位对应的权分别是
23、22、21、20,即8、4、2、1。例如十进制数1975的8421码可以这样得出

1975(D)=0001 1001 0111 0101(BCD)

用四位二进制表示一位十进制会多出6种状态,这些多余状态码称为BCD码中的非法码。
BCD码与二进制之间的转换不是直接进行的,
当需要将BCD码转换成二进制码时,要先将BCD码转换成十进制码,然后再转换成二进制码;
当需要将二进制转换成BCD码时,要先将二进制转换成十进制码,然后再转换成BCD码。

编码过程,将数字69进行BCD编码(注:BCD编码低位在前,后面将不再注释)。

1. 将6,9分别转换成二进制表示:6(00000110)9(00001001),大家可以看到,最大的数字9也只要4个位,在传输过程中白白浪费了4个位;

2. 将69合并为一个字节,分别取6,9二进制编码的低4位,按照低位在前的原则,将9的低四位放前面6的低四位放后面得出新的字节二进制编码是10010110;

3. 完成编码过程,69的BCD编码结果为10010110。

解码过程:将69的BCD码10010110进行解码。

1. 将10010110的高4位与低4位拆分开,得到两个二进制数1001和0110;

2. 分别将1001和0110的前面补充4位0000得到两个8位的二进制数00001001,00000110;

3. 因为编码时低位在前,所以我们将两个二进制数编排顺序为00000110 000010001;

C#版代码实现:

int x=97; ///要对整数97BCD编码
byte m=(((byte)7)<<4)+(((byte)9));
//得到的m即为数字97和BCD码字节表现形式

string bs="";
bs=(((byte)(m<<4))>>4)).ToString()+"+"+(m>>4).ToString();

bs即为从BCD码解得的字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼编码是一种常用的数据压缩算法,它通过将出现频率较高的字符用较短的编码表示,而将出现频率较低的字符用较长的编码表示,从而实现对数据的压缩。以下是哈夫曼编码解码的基本步骤: 1. 统计字符频率:遍历待编码的文本,统计每个字符出现的频率。 2. 构建哈夫曼树:根据字符频率构建哈夫曼树。哈夫曼树是一种特殊的二叉树,其中每个叶子节点代表一个字符,而非叶子节点代表字符频率之和。 3. 生成编码表:从根节点开始,遍历哈夫曼树的路径,左子树路径标记为0,右子树路径标记为1,将每个字符对应的路径记录下来,形成编码表。 4. 进行编码:根据生成的编码表,将待编码的文本中的每个字符替换为对应的编码。 5. 进行解码:使用相同的哈夫曼树和编码表,将编码后的数据进行解码,恢复原始文本。 在C#中实现哈夫曼编码解码可以按照以下步骤进行: 1. 定义字符频率统计函数:遍历待编码的文本,统计每个字符出现的频率。 2. 构建哈夫曼树:根据字符频率构建哈夫曼树。可以使用优先队列(PriorityQueue)来实现。 3. 生成编码表:从根节点开始,遍历哈夫曼树的路径,左子树路径标记为0,右子树路径标记为1,将每个字符对应的路径记录下来,形成编码表。 4. 进行编码:根据生成的编码表,将待编码的文本中的每个字符替换为对应的编码。 5. 进行解码:使用相同的哈夫曼树和编码表,将编码后的数据进行解码,恢复原始文本。 以下是C#代码示例: ```csharp // 定义节点类 class Node { public char Character { get; set; } public int Frequency { get; set; } public Node Left { get; set; } public Node Right { get; set; } } // 构建哈夫曼树 private static Node BuildHuffmanTree(Dictionary<char, int> frequencies) { var priorityQueue = new PriorityQueue<Node>(Comparer<Node>.Create((a, b) => a.Frequency - b.Frequency)); foreach (var kvp in frequencies) { priorityQueue.Enqueue(new Node { Character = kvp.Key, Frequency = kvp.Value }); } while (priorityQueue.Count > 1) { var left = priorityQueue.Dequeue(); var right = priorityQueue.Dequeue(); var parent = new Node { Frequency = left.Frequency + right.Frequency, Left = left, Right = right }; priorityQueue.Enqueue(parent); } return priorityQueue.Dequeue(); } // 生成编码表 private static Dictionary<char, string> GenerateCodeTable(Node root) { var codeTable = new Dictionary<char, string>(); TraverseTree(root, "", codeTable); return codeTable; } // 遍历哈夫曼树,生成编码表 private static void TraverseTree(Node node, string code, Dictionary<char, string> codeTable) { if (node.Left == null && node.Right == null) { codeTable[node.Character] = code; return; } TraverseTree(node.Left, code + "0", codeTable); TraverseTree(node.Right, code + "1", codeTable); } // 进行编码 private static string Encode(string text, Dictionary<char, string> codeTable) { var encodedText = new StringBuilder(); foreach (var c in text) { encodedText.Append(codeTable[c]); } return encodedText.ToString(); } // 进行解码 private static string Decode(string encodedText, Node root) { var decodedText = new StringBuilder(); var currentNode = root; foreach (var bit in encodedText) { if (bit == '0') { currentNode = currentNode.Left; } else if (bit == '1') { currentNode = currentNode.Right; } if (currentNode.Left == null && currentNode.Right == null) { decodedText.Append(currentNode.Character); currentNode = root; } } return decodedText.ToString(); } // 示例用法 string text = "Hello, World!"; Dictionary<char, int> frequencies = new Dictionary<char, int>(); foreach (var c in text) { if (frequencies.ContainsKey(c)) { frequencies[c]++; } else { frequencies[c] = 1; } } Node root = BuildHuffmanTree(frequencies); Dictionary<char, string> codeTable = GenerateCodeTable(root); string encodedText = Encode(text, codeTable); string decodedText = Decode(encodedText, root); Console.WriteLine("Encoded Text: " + encodedText); Console.WriteLine("Decoded Text: " + decodedText); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值