【问题标题】:C# Converting base64 string to 16-bit words stored in little-endian byte orderC#将base64字符串转换为以little-endian字节顺序存储的16位字
【发布时间】:2020-08-05 07:56:41
【问题描述】:

我正在尝试上传签名的 base64,但我需要它是以小端字节顺序存储的 16 位字数组的 ba​​se64 编码。谁能帮我将base64转换为little-endian字节的16位数组,然后再转换为base64?

【问题讨论】:

  • 你想在一个 2 字节数组中存储一个 base64 的东西?
  • @TheGeneral 我需要将签名的 base64 字符串以小端字节顺序转换为 16 位数组。这是我正在使用的手册上的确切说明。 “在 XML 数据包中传递的签名是下面描述的二进制签名结构的 base-64 编码。二进制签名结构是一个 16 位字的数组,以 little-endian 字节顺序存储。每个字可以存储任一运行长度编码数据或逐像素数据。单词存储一串比特,对应于从左到右、从下到上的序列中的白色和黑色像素。"
  • 你用的是什么框架? .Net Core 3.x 或 .Net Framework 4.?
  • @MatthewWatson 我正在使用 .Net Framework 4.5
  • 这必须在可能是大端的系统上运行吗? (Intel 和 AMD 架构是 little-endian)

标签: c# arrays type-conversion base64 endianness


【解决方案1】:

为此,您可以创建正确类型的数组(byte[] 和 short[])并使用Buffer.BlockCopy() 在它们之间复制字节,从而转换数据。

这并没有说明 little-endian/big-endian 的差异,但由于您声明这只需要在 little-endian 系统上运行,我们无需担心。

这是一个演示如何进行转换的示例控制台应用。它执行以下操作:

  1. 创建一个包含 0..99 的短裤数组。
  2. 将 short 数组转换为字节数组(保留字节顺序)。
  3. 将字节数组转换为 base 64 字符串。
  4. 将 base 64 字符串转换回字节数组。
  5. 将字节数组转换回短裤数组(保留字节顺序)。
  6. 将转换后的短裤数组与原始数组进行比较以证明正确性。

代码如下:

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create demo array of shorts 0..99 inclusive.

            short[] sourceShorts = Enumerable.Range(0, 100).Select(i => (short)i).ToArray();

            // Convert array of shorts to array of bytes. (Will be little-endian on Intel.)

            int byteCount = sizeof(short) * sourceShorts.Length;
            byte[] dataAsByteArray = new byte[byteCount];
            Buffer.BlockCopy(sourceShorts, 0, dataAsByteArray, 0, byteCount);

            // Convert array of bytes to base 64 string.

            var asBase64 = Convert.ToBase64String(dataAsByteArray);
            Console.WriteLine(asBase64);

            // Convert base 64 string back to array of bytes.

            byte[] fromBase64 = Convert.FromBase64String(asBase64);

            // Convert array of bytes back to array of shorts.

            if (fromBase64.Length % sizeof(short) != 0)
                throw new InvalidOperationException("Byte array size must be multiple of sizeof(short) to be convertable to shorts");

            short[] destShorts = new short[fromBase64.Length/sizeof(short)];
            Buffer.BlockCopy(fromBase64, 0, destShorts, 0, fromBase64.Length);

            // Prove that the unconverted shorts match the source shorts.

            if (destShorts.SequenceEqual(sourceShorts))
                Console.WriteLine("Converted and unconverted successfully");
            else
                Console.WriteLine("Error: conversion was unsuccessful");
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 2018-12-09
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多