sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLbytea列の16進数をrのint16/uint16にデコードする方法は?

    この変換関数から始めて、より高速なstrsplitに置き換えることができます readBinを使用します 結果について:

    byteArray <- "\\xffff00000100020003000400050006000700080009000a00"
    
    ## Split a long string into a a vector of character pairs
    Rcpp::cppFunction( code = '
    CharacterVector strsplit2(const std::string& hex) {
      unsigned int length = hex.length()/2;
      CharacterVector res(length);
      for (unsigned int i = 0; i < length; ++i) {
        res(i) = hex.substr(2*i, 2);
      }
      return res;
    }')
    
    ## A function to convert one string to an array of raw
    f <- function(x)  {
      ## Split a long string into a a vector of character pairs
      x <- strsplit2(x)
      ## Remove the first element, "\\x"
      x <- x[-1]
      ## Complete the conversion
      as.raw(as.hexmode(x))
    }
    
    raw <- f(byteArray)
    # int16
    readBin(con = raw,
            what = "integer",
            n = length(raw) / 2,
            size = 2,
            signed = TRUE,
            endian = "little")
    # -1  0  1  2  3  4  5  6  7  8  9 10
    
    # uint16
    readBin(con = raw,
            what = "integer",
            n = length(raw) / 2,
            size = 2,
            signed = FALSE,
            endian = "little")
    # 65535     0     1     2     3     4     5     6     7     8     9    10
    
    # int32
    readBin(con = raw,
            what = "integer",
            n = length(raw) / 4,
            size = 4,
            signed = TRUE,
            endian = "little")
    # 65535 131073 262147 393221 524295 655369
    

    これはuint32では機能しません および(u)int64 ただし、Rはint32を使用するため 初めの。ただし、Rはnumericsを使用することもできます 2^52未満の整数を格納します。したがって、これを使用できます:

    # uint32
    byteArray <- "\\xffffffff0100020003000400050006000700080009000a00"
    int32 <- readBin(con = f(byteArray),
                     what = "integer",
                     n = length(raw) / 4,
                     size = 4,
                     signed = TRUE,
                     endian = "little")
    
    ifelse(int32 < 0, int32 + 2^32, int32)
    # 4294967295     131073     262147     393221     524295     655369
    

    そしてgzipの場合 圧縮データ:

    # gzip
    byteArray <- "\\x1f8b080000000000000005c1870100200800209a56faffbd41d30dd3b285e37a52f9d033018818000000"
    con <- gzcon(rawConnection(f(byteArray)))
    readBin(con = con,
            what = "integer",
            n = length(raw) / 2,
            size = 2,
            signed = TRUE,
            endian = "little")
    close(con = con)
    

    これは実際の接続であるため、必ず閉じる必要があります。




    1. OBJECTPROPERTY()を使用して、オブジェクトがSQLServerのユーザー定義テーブルであるかどうかを確認します。

    2. AndroidでSQLCipherを使用する

    3. SQLServer2017の復元

    4. psycopg2のパラメーターとしてテーブル名を渡す