C# C语言中的通用字符串编码器#
我需要的是非常简单的,但在我重新发明轮子之前,我想知道框架中是否已经存在类似的东西 我想对预定义字符表中的字符串进行编码(和解码)。我有许多包含很少字符的字符串。下面是我要编码的字符串: cn=1;pl=23;vf=3;vv=0 这个字符串大小是20个字符,所以是20个字节 在字符串中,我只使用以下字符:cn=1;p23vf0 总共11个字符。所以每个字符只能用4位编码,不是吗?将使用的字节总数减少到10 NET中是否有任何现有方法可以在参数和引用表数组中获取字符串并返回编码的字节 char[]reference=“cn=1;p23vf0”; 字符串输入=“cn=1;pl=23;vf=3;vv=0” byte[]encoded=someClass.Encode(输入,引用); string decoded=someClass.Decode(编码,引用)C# C语言中的通用字符串编码器#,c#,C#,我需要的是非常简单的,但在我重新发明轮子之前,我想知道框架中是否已经存在类似的东西 我想对预定义字符表中的字符串进行编码(和解码)。我有许多包含很少字符的字符串。下面是我要编码的字符串: cn=1;pl=23;vf=3;vv=0 这个字符串大小是20个字符,所以是20个字节 在字符串中,我只使用以下字符:cn=1;p23vf0 总共11个字符。所以每个字符只能用4位编码,不是吗?将使用的字节总数减少到10 NET中是否有任何现有方法可以在参数和引用表数组中获取字符串并返回编码的字节 char[]
AreEqual(输入,解码) 基类库中没有类似的东西。你必须建立你自己的
查看System.Text中的类-某些元素可能有帮助。该类是否有帮助?您可以使用CrytPai。下面是一个很好的示例,用于加密和解密字符串的方法。不过,我认为它不会为您“压缩”数据。没有现成的类可以做到这一点,但使用.NET类并不难。 一旦有了位数组,就可以将其转换为字符串或压缩字节表示形式
// modify this as appropriate to divide your original input string...
public IEnumerable<string> Divide( string s )
{
for( int i = 0; i < s.Length; i += 2 )
yield return s.Substring( i, 2 );
}
public IEnumerable<bool> AsBoolArray( byte b )
{
var i = 4; // assume we only want 4-bits
while( i-- > 0 )
{
yield return (b & 0x01) != 0;
b >>= 1;
}
}
// define your own mapping table...
var mappingTable =
new Dictionary<string,int>() { {"cn", 1}, {"pl",23}, {"vf",3}, {"vv",0} /*...*/ };
var originalString = "cncnvfvvplvvplpl";
// encode the data by mapping each string to the dictionary...
var encodedData = DivideString( originalString ).Select( s => mappingTable[s] );
// then convert into a bitVector based on the boolean representation of each value...
// The AsBoolArray() method return the 4-bit encoded bool[] for each value
var packedBitVector =
new BitArray( encodedData.Select( x => AsBoolArray(x) ).ToArray() );
// you can use BitArray.CopyTo() to get the representation out as a packed int[]
//根据需要修改此项以分割原始输入字符串。。。
公共IEnumerable除法(字符串s)
{
对于(int i=0;i0)
{
收益率回报率(b&0x01)!=0;
b>>=1;
}
}
//定义您自己的映射表。。。
变量映射表=
新字典(){“cn”,1},{“pl”,23},{“vf”,3},{“vv”,0}/*…*/};
var originalString=“cncnvvvplpl”;
//通过将每个字符串映射到字典对数据进行编码。。。
var encodedData=DivideString(originalString).Select(s=>mappingTable[s]);
//然后根据每个值的布尔表示将其转换为位向量。。。
//AsBoolArray()方法为每个值返回4位编码的bool[]
var packedBitVector=
新的位数组(encodedData.Select(x=>AsBoolArray(x)).ToArray());
//您可以使用BitArray.CopyTo()将表示形式作为压缩int[]
我认为如果您想最小化字符串的大小,最好在这里使用System.IO.Compression.gzip流。它非常简单,可能会将字符串压缩2次以上。任何压缩算法都会使用它。这基本上就是你在这里寻找的。这种编码并没有单独作为一个类公开,它是DeflateStream和GZipStream类算法的一部分。这是你应该使用的,只要你的琴弦大小合理。如果它们很短,那么编码它们就没有任何意义 提问。。。框架中没有构建任何内容,但可以这样做,例如:
public static byte[] Encode(string input, string reference) {
int size = 1;
while ((1 << ++size) < reference.Length);
byte[] result = new byte[(size * input.Length + 7) / 8];
new BitArray(
input
.Select(c => {
int index = reference.IndexOf(c);
return Enumerable.Range(0, size).Select(i => (index & (1 << i)) != 0);
})
.SelectMany(a => a)
.ToArray()
).CopyTo(result, 0);
return result;
}
public static string Decode(byte[] encoded, int length, string reference) {
int size = 1;
while ((1 << ++size) < reference.Length);
return new String(
new BitArray(encoded)
.Cast<bool>()
.Take(length * size)
.Select((b, i) => new { Index = i / size, Bit = b })
.GroupBy(g => g.Index)
.Select(g => reference[g.Select((b, i) => (b.Bit ? 1 : 0) << i).Sum()])
.ToArray()
);
}
要解码字符串,您还需要原始字符串的长度,因为这无法从编码数据的长度中分辨出来:
string decoded = Decode(encoded, input.Length, reference);
(当然,除了提供长度之外,还可以引入EOF字符,或者类似于base64填充数据的填充字符。)
string decoded = Decode(encoded, input.Length, reference);