@@ -29,13 +29,13 @@ public SafeStringTensorHandle StringTensor(byte[][] buffer, Shape shape)
2929
3030 var tstr = c_api . TF_TensorData ( handle ) ;
3131#if TRACK_TENSOR_LIFE
32- print ( $ "New TString 0x { handle . ToString ( "x16" ) } Data: 0x{ tstr . ToString ( "x16" ) } ") ;
32+ print ( $ "New StringTensor { handle } Data: 0x{ tstr . ToString ( "x16" ) } ") ;
3333#endif
3434 for ( int i = 0 ; i < buffer . Length ; i ++ )
3535 {
3636 c_api . TF_StringInit ( tstr ) ;
3737 c_api . TF_StringCopy ( tstr , buffer [ i ] , buffer [ i ] . Length ) ;
38- var data = c_api . TF_StringGetDataPointer ( tstr ) ;
38+ // var data = c_api.TF_StringGetDataPointer(tstr);
3939 tstr += TF_TSRING_SIZE ;
4040 }
4141
@@ -53,6 +53,36 @@ public string[] StringData()
5353 return _str ;
5454 }
5555
56+ public string StringData ( int index )
57+ {
58+ var bytes = StringBytes ( index ) ;
59+ return Encoding . UTF8 . GetString ( bytes ) ;
60+ }
61+
62+ public byte [ ] StringBytes ( int index )
63+ {
64+ if ( dtype != TF_DataType . TF_STRING )
65+ throw new InvalidOperationException ( $ "Unable to call StringData when dtype != TF_DataType.TF_STRING (dtype is { dtype } )") ;
66+
67+ byte [ ] buffer = new byte [ 0 ] ;
68+ var tstrings = TensorDataPointer ;
69+ for ( int i = 0 ; i < shape . size ; i ++ )
70+ {
71+ if ( index == i )
72+ {
73+ var data = c_api . TF_StringGetDataPointer ( tstrings ) ;
74+ var len = c_api . TF_StringGetSize ( tstrings ) ;
75+ buffer = new byte [ len ] ;
76+ // var capacity = c_api.TF_StringGetCapacity(tstrings);
77+ // var type = c_api.TF_StringGetType(tstrings);
78+ Marshal . Copy ( data , buffer , 0 , Convert . ToInt32 ( len ) ) ;
79+ break ;
80+ }
81+ tstrings += TF_TSRING_SIZE ;
82+ }
83+ return buffer ;
84+ }
85+
5686 public byte [ ] [ ] StringBytes ( )
5787 {
5888 if ( dtype != TF_DataType . TF_STRING )
0 commit comments