C++ 保持词典顺序的基元类型的字符串编码

C++ 保持词典顺序的基元类型的字符串编码,c++,string,encode,lexicographic,C++,String,Encode,Lexicographic,有人知道一个库可以将许多基本类型(如整数、浮点数、字符串等)编码成字符串,但保留类型的名称吗 理想情况下,我正在寻找C++库,但其他语言也很好。此外,可以假设格式不需要在字符串本身中编码(即,如果它是int64/string/float,则编码的字符串不需要对该信息进行编码,仅对数据进行编码就足够了)。只需在固定的列宽中写入数值,并使用前导零,并将字符串作为正常字符串。所以像这样: 0.1 -> 0000000.1000000 123 -> 0000123.0000000 foo -

有人知道一个库可以将许多基本类型(如整数、浮点数、字符串等)编码成字符串,但保留类型的名称吗


理想情况下,我正在寻找C++库,但其他语言也很好。此外,可以假设格式不需要在字符串本身中编码(即,如果它是int64/string/float,则编码的字符串不需要对该信息进行编码,仅对数据进行编码就足够了)。

只需在固定的列宽中写入数值,并使用前导零,并将字符串作为正常字符串。所以像这样:

0.1 -> 0000000.1000000
123 -> 0000123.0000000
foo -> foo
X   -> X
然后,您可以按文本排序(例如,Unix
排序
,而不使用
-n
)。怎么样?

看看这篇论文(“数字的有效字典编码”),它展示了如何将任何数字类型表示为字符串,这样字符串的字典顺序与基础数字的数字顺序相同。它可以处理任意长度的数字


我遇到了将整数和long转换为保留顺序的字符串的问题。因为我在Java工作,所以我只有签名类型

我的算法非常简单:

  • 翻转符号位(
    toEncode^Long.MAX_VALUE
    表示Long),否则负数大于正数
  • 对字节执行修改后的base64编码。不幸的是,正常的base64编码不能保持顺序;特殊字符(
    +
    /
    )位于字符后面的数字之后。这与ASCII完全相反。我修改的编码只是使用ASCII排序。(为了说明这不是正常的base64,我将特殊字符改为
    -
    -
    ,并使用
    ~
    作为填充。这些字符在URL中仍然可用,这是我的另一个限制。)
  • 顺便说一句。。。 在AmazonWeb服务的SimpleDB中,所有数据都存储为字符串。它的比较器使用字典排序。AWS提供了对各种类型进行编码的实用功能。例如,整数编码时预先知道整数的范围,并通过零填充和偏移量进行调整(例如,对于负整数)。你当然可以给它一个最坏的范围

    请参阅“查询201:Amazon SimpleDB查询的提示和技巧”——


    你能澄清你想要什么吗?你所说的整数和浮点数的字典顺序是什么意思?它们的字典排序取决于您对它们的编码方式,例如二进制、八进制、十进制、十六进制等(假设前导数字已删除),所有这些都将为给定的数字列表提供不同的字典排序。所谓字典排序,我指的是原始类型的原始顺序(显然不是字符串)。例如,将“(a,b,c)”编码为字符串“s”,这样“(a,b,c)<(a',b',c')”就意味着所有a,b,c的“s'+'字符具有较低的整数值43和
    '0'
    (整数值48)。这提供了不正确的排序语义。通过使用ASCII平面中较高的字符,例如
    '='
    (整数值61),即使在比较具有不同前缀字符数的字符串时,也会给出正确的结果。您的修改后的Base 64编码器是否是任何开源Java库的一部分?