将PHP字符串从24个字符压缩(缩短)到20个字符

我目前正在编写一个使用Authorize.net api的PHP应用程序。 此API要求客户的唯一ID值小于20个字符。 我目前将这个唯一的客户ID存储在Mongo中作为MongoId对象(24个字符)。</ p>

有没有办法将24个字符的字符串转换为20个,以便它可以满足API 要求?</ p>
</ div>

展开原文

原文

I'm currently writing a PHP application that utilizes the Authorize.net api. This api requires that a customer's unique id value be less than 20 characters. I'm currently storing this unique customer id in Mongo as a MongoId object (24 characters).

Is there a way to convert a 24 character string to 20 so that it can meet the API requirements ?

douzhuang2016
douzhuang2016 它是BSON数据类型。docs.mongodb.org/manual/reference/object-id
6 年多之前 回复
dqlxtv1452
dqlxtv1452 $id=substr($id,0,20);但是说真的,生成一个20个字符并将其映射到24个字符。可能应该从20开始并使用它。
6 年多之前 回复
dongrongdao8902
dongrongdao8902 使用了什么字符(24位,字母数字,完整二进制)?允许哪些字符?
6 年多之前 回复

1个回答



从我在您引用的页面上看到的,24个字符是十六进制的。 如果customer-id可能是字母数字,您可以使用 base_convert 来缩短数字。 不幸的是,完整的数字是> 32位所以你需要将其部分转换为使其工作:</ p>

  //使用0来填充以确保你有24个字符
$ padded = str_repeat('0' ,24 - strlen($ mongoId))。 $ mongoId;
$ leastSignificant = base_convert(substr($ padded,14,10),16,32); //最多8个字符
$ middleSignificant = base_convert(substr($ padded,4,10),16,32); //最多8个字符
$ highSignificant = base_convert(substr($ padded,0,4),16,32); //将最多4个字符

//连接,并确保所有内容都正确填充
$ result = str_repeat('0',4 - strlen($ highSignificant))。 $ highSignificant。
str_repeat('0',8 - strlen($ middleSignificant))。 $ middleSignificant。
str_repeat('0',8 - strlen($ leastSignificant))。 $ leastSignificant;
echo strlen($ result); //将回显20

//反转算法以检索给定customerId
</ code> </ pre>
</ div>的mongoId

展开原文

原文

From what I see on your referenced page, the 24-characters are hexadecimal. If customer-id may be alphanumerical you can use base_convert to shorten the number. Unfortunately the full number is > 32bit so you need to covert it in parts to make it work:

// Pad with 0's to make sure you have 24 chars
$padded = str_repeat('0', 24 - strlen($mongoId)) . $mongoId;
$leastSignificant = base_convert(substr($padded, 14, 10), 16, 32); // will be 8 chars most
$middleSignificant = base_convert(substr($padded, 4, 10), 16, 32); // will be 8 chars most
$highSignificant = base_convert(substr($padded, 0, 4), 16, 32); // will be 4 chars most

// Concatenate, and make sure everything is correctly padded
$result = str_repeat('0', 4 - strlen($highSignificant)) . $highSignificant .
          str_repeat('0', 8 - strlen($middleSignificant )) . $middleSignificant .
          str_repeat('0', 8 - strlen($leastSignificant )) . $leastSignificant;
echo strlen($result); // Will echo 20

// Reverse the algoritm to retrieve the mongoId for a given customerId 

douweng7308
douweng7308 不客气,我喜欢那种谜题;)
6 年多之前 回复
dongmi4035
dongmi4035 我发现这个线程暗示了类似的方法,虽然不是php。 stackoverflow.com/questions/4261129/...。 这非常有帮助。 谢谢您的帮助。
6 年多之前 回复
dongsong1911
dongsong1911 如果你有GNU Multiple Precision-extension(只是尝试),你甚至可以用base-62-notation(17个字符)进一步:$ short = gmp_strval(gmp_init(str_repeat('F',24),16),62 ); 后续代码var_dump($短); $ reverse = gmp_strval(gmp_init($ short,62),16); 的var_dump($反向);
6 年多之前 回复
dqoag62688
dqoag62688 这是一个有趣的方法,我当然不会想到这一点。 我现在正在尝试。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐