如何按字节顺序为AWS-Call排序列表

时间:2015-09-26 15:00:52

标签: r sorting amazon-web-services amazon-product-api endianness

查看http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html

以下名称 - 值对:

Service=AWSECommerceService
Version=2011-08-01
AssociateTag=PutYourAssociateTagHere
Operation=ItemSearch
SearchIndex=Books
Keywords=harry+potter
Timestamp=2015-09-26T14:10:56.000Z
AWSAccessKeyId=123
  

名称 - 值对已根据字节顺序

进行排序

应该导致

AWSAccessKeyId=123
AssociateTag=PutYourAssociateTagHere
Keywords=harry%20potter
Operation=ItemSearch
SearchIndex=Books
Service=AWSECommerceService
Timestamp=2015-09-26T14%3A10%3A56.000Z
Version=2011-08-01

如何在R?

中实现这一目标

据我所知,他们按照他们的排序 as.numeric(charToRaw(name))值。如果第一个值相等,则按第二个值排序,然后按第三个值排序,依此类推。

问题:如何在R中执行此操作?

2 个答案:

答案 0 :(得分:4)

# Name-Value-Pairs
nvp <- list(                                
"Service"="AWSECommerceService",
"Version"="2011-08-01",
"AssociateTag"="PutYourAssociateTagHere",
"Operation"="ItemSearch",
"SearchIndex"="Books",
"Keywords"="harry potter",
"Timestamp"="2015-09-26T14:10:56.000Z",
"AWSAccessKeyId"="123"
)

获取字节:

bytes <- function(chr){
  as.data.frame(t(as.numeric(charToRaw(chr))))
}

计算字节数,然后判断值

b <- lapply(names(nvp), bytes)
b <- data.table::rbindlist(b, fill=TRUE) # other than base::rbind, this fills by NA

按第一栏,第二栏,第三栏,......等命名名称

names(nvp)[do.call(order, as.list(b))]

[1] "AWSAccessKeyId" "AssociateTag"   "Keywords"       "Operation"      "SearchIndex"   
[6] "Service"        "Timestamp"      "Version"   

所以最终nvp[do.call(order, as.list(b))]在正确排序的列表中返回

答案 1 :(得分:1)

@ Floo0上面的答案非常好,与this answer的加密签名结合使用时更有用。

我被困住了,直到找到这两个帖子。我使用了亚马逊的Signed Request Helper来验证我是否成功签署了我的查询。使用上面的代码对查询和此代码(again found here)进行正确的规范排序以对其进行签名:

library(digest)
library(RCurl)

curlEscape(
  base64(
         hmac(enc2utf8((secret_key)), 
              enc2utf8(string_to_sign), 
              algo = 'sha256', 
              serialize = FALSE,  
               raw = TRUE)
          )
         )  

此外,我还没有使用它,但有Python moduleamazon-product-api,似乎工作量较少。